Если алфавитные символы расположены последовательно в целевой кодировке , используйте следующую команду подстановки .
:%s/./\=nr2char(char2nr(submatch(0))+2)/g
Однако эта замена реализует некруглую смену букв. Круговой сдвиг может быть осуществлен двумя заменами, которые обрабатываются в нижнем регистре и прописными буквами.
:%s/\l/\=nr2char(char2nr('a') + (char2nr(submatch(0)) - char2nr('a') + 2) % 26)/g
:%s/\u/\=nr2char(char2nr('A') + (char2nr(submatch(0)) - char2nr('A') + 2) % 26)/g
Другой способ заключается в преобразовании символов с помощью функции tr()
. Предположим, что переменная a
содержит строчные буквы алфавита , расположенных в правильном порядке, а переменная a1
содержит строку символов , соответствующую значениям в a
(ниже приведен пример для английских букв).
:let a = 'abcdefghijklmnopqrstuvwxyz'
:let a1 = a[2:] . a[:1]
Чтобы не вводить весь алфавит вручную, значение a
может быть произведено следующим образом,
:let a = join(map(range(char2nr('a'), char2nr('z')), 'nr2char(v:val)'), '')
Затем, чтобы заменить каждую букву в строке письма две позиции вниз алфавит, использовать замену
:%s/.*/\=tr(submatch(0), a . toupper(a), a1 . toupper(a1))
Это верно для ASCII и некоторых алфавитов в UTF-8, например. Английский.
Перед выполнением команды, убедитесь, что encoding
вариант устанавливается соответствующим образом.
Спасибо .. Но если я хочу, чтобы круглая замена ..как y-> a z-> b, возможно ли это в одной отдельной строке? – hari
@hari: см. Редактирование ответа. –
просто небольшое примечание: строка '.', которая объединяет строку, затрудняет чтение при кодировании на C++, я бы предпочел, чтобы она дополнялась пробелами с обеих сторон (кажется, что вы не играли в гольф в это время, учитывая пробелы после запятых !) – Benoit