function Enquote()
let [startline, endline]=sort([line("'<"), line("'>")])
let lines=getline(startline, endline)
let lengths=map(copy(lines), 'len(split(v:val, ''\zs''))')
let maxlen=max(lengths)
call map(lines, '''"''.v:val.repeat(" ", maxlen-lengths[v:key]).''"''')
return setline(startline, lines)
endfunction
Объяснение:
line("'<")
и line("'>")
получают номера строк начала и конца последнего визуального выбора.
sort([...])
сортирует номера строк, так как вы можетеначали выделять строки с конца выделения.
let [a, b]=[c, d]
- это параллельное присваивание: sort
создаст отсортированный список из двух элементов, где первый элемент меньше или равен второму элементу.Очевидно, что меньше - это первая выбранная строка.
len(split(v:val, '\zs'))
- это расширенный strlen()
, который поддерживает юникод.
max(list)
находит максимальное значение.Очевидно.
Итак, map(copy(lines), 'len(split(v:val, ''\zs''))')
применяет это strlen
ко всем элементам в списке.copy()
требуется, поскольку мы не хотим, чтобы наш список был изменен.
map(lines, '''"''.v:val.repeat(" ", maxlen-lengths[v:key]).''"''')
изменяет строки так, как вам нужно.Я переключился с printf
на repeat
, потому что printf неправильно обрабатывает многобайтовые символы (под «правильно» я подразумеваю, что «¥» имеет длину один символ, в то время как printf считает его длиной два байта).1032 * фактически изменяет буфер.