Справка имеет пример для аналогичного варианта использования разных ширины табуляции, см. :help retab-example
.
Адаптация этого к пространствам с удвоением / удвоением:
:autocmd BufReadPost,BufWritePost * %substitute/^\( \+\)\1/\1/e
:autocmd BufWritePre * %substitute/^ \+/&&/e
Оператор splat (то есть *
) превращает то, что в противном случае было бы массивом, в список для присвоения внутри хеша. Вы должны предоставить оператору []
фактический список, чтобы он превратился в пары ключ / значение хэша. (См. Ниже ссылку на краткое описание оператора splat, который на самом деле может делать это (разворачивать массив в список) или наоборот (собирать список в массив).)
Как вы это сделали выше, вы даете Hash []
нечетное количество элементов , а именно один массив. (Подумайте о том, что производит [[: first_name, 'Shane'], [: last_name, 'Harvie']]. Flatten
. Результатом является [: first_name, 'Shane',: last_name, ' Havie ']
.) Как говорится в цитированных вами документах, оператор []
должен иметь четное число элементов. Обратите внимание, что следующий (хотя и бесполезный) действительно работает :
>> Hash[[[:first_name, 'Shane'], [:last_name, 'Harvie']].flatten, 1]
=> {[:first_name, "Shane", :last_name, "Harvie"]=>1}
(Мне непонятно, почему вы не получаете ошибку «нечетное количество аргументов для хеширования» при использовании приведенного выше кода - поскольку вы это сделаете, если попробуете Hash [1]
.)
Более простой пример может прояснить ситуацию. Сначала передается один элемент, массив. Открытие массива с помощью *
для передачи Hash []
списка элементов:
>> Hash[['foo', 'bar', 'bizz', 'buzz']]
=> {}
>> Hash[*['foo', 'bar', 'bizz', 'buzz']]
=> {"foo"=>"bar", "bizz"=>"buzz"}
См. это сообщение в блоге для более полного объяснения. Вы также можете найти эту короткую запись об операторе splat полезной.
) Более простой пример может прояснить ситуацию. Сначала передается один элемент, массив. Открытие массива с помощью *
для передачи Hash []
списка элементов:
>> Hash[['foo', 'bar', 'bizz', 'buzz']]
=> {}
>> Hash[*['foo', 'bar', 'bizz', 'buzz']]
=> {"foo"=>"bar", "bizz"=>"buzz"}
См. это сообщение в блоге для более полного объяснения. Вы также можете найти эту короткую запись об операторе splat полезной.
) Более простой пример может прояснить ситуацию. Сначала передается один элемент, массив. Открытие массива с помощью *
для передачи Hash []
списка элементов:
>> Hash[['foo', 'bar', 'bizz', 'buzz']]
=> {}
>> Hash[*['foo', 'bar', 'bizz', 'buzz']]
=> {"foo"=>"bar", "bizz"=>"buzz"}
См. это сообщение в блоге для более полного объяснения. Вы также можете найти эту короткую запись об операторе splat полезной.