Про Vim » Форматирование / Хабр
Расстановка запятых
Что чаще всего нужно программисту от форматирования? Расстановка отступов? Или может быть разбиение списков параметров по вертикали? Следование каким-то конвенциям стиля? А вот и нет. Мне, как программисту, жутко не хватает программы, которая бы расставляла за меня запятые. Ну, или удаляла оттуда там где их быть не должно. На данный момент я так понимаю, можно воспользоваться каким-нибудь онлайн-сервисом или, в лучшем случае, как-то подцепиться к API. Есть на этот счет пара вариантов типа https://text.ru/api-check, https://sinoni.men/ или https://languagetool.org/ru/.
Однако, понятно, это всё ограничено и недешево. Да и это скорее эдакие линтеры, которые могут достаточно хорошо предположить и указать на явные ошибки. Про линтеры отдельный разговор. Вот бы было здорово сделать локальный LSP сервер для русского языка? Как вам идея для стартапа? Я провел достаточно много времени с экспериментами над грамматическим и морфологическим разбором предложений на русском языке. Была даже попытка прикоснуться к лингвистическим корпусам и нейронным сетям. Не могу сказать, что эксперименты закончились чем-то примечательным. Однако могу утверждать, что до определенной степени такую затею вполне можно воплотить даже в одного. Всё зависит лишь от желаемой точности и универсальности продукта. Если, положа руку на сердце, оценить, то как пишут даже вполне грамотные люди, то достичь уровня десятого класса средней школы уже было бы большим делом. Если текст состоит не из помеси трех языков, топонимов, имен древнеегипетских богов и сложносочиненных оборотов, коих большинство, то каких-нибудь 90% точности при расстановке запятых и двоеточий хватило бы за глаза.
Но это такое так — лирическое отступление. Мечты. А теперь о наших баранах.
coc-sql
В результате упражнений сделанных в предыдущей статье Vim теперь умеет во всякое, в том числе и в автоматическое форматирование. А форматировать я хочу SQL запросы и исходники на PL/SQL, то бишь процедуры, скрипты и прочий DDL. Так вот, если у стандартного форматировщика с запросами всё еще не очень плохо, то с остальным что-то у разработчика расширения явно не заладилось. Кому-то может хватить и форматирования исключительно запросов. По умолчанию ~/.vim/coc.vim
добавляет сочетание <leader>lf
для всех подключенных LSP и садит на него команду форматирования выделенной области. Я решил, что добавить сочетание для форматирования всего буфера будет не лишним.
nmap <leader>lF <Plug>(coc-format)
Помимо этого можно, разумеется, настроить форматирование при сохранении, но это сразу мне не понравилось потому что, ну, не всегда это требуется, да и форматировать любой легаси код не очень то разумно по разным причинам.
Родной форматировщик sql-formatter имеет ряд настраиваемых опций, которые можно положить в coc-settings.json
как глобально, так и локально для определенного проекта. Я положил конфигурацию с полным перечнем опций в репозиторий на GitHub. В нем так же можно подключить и настроить линтер, который, так же как и форматировщик почему-то не умеет в процедуры и скрипты — только запросы. По этому я его тут же отключил. Запросы мне проверять незачем — они либо работают, либо нет.
Поэтому я недолго думая отправился искать альтернативное расширение, может быть даже ограниченное одним только PL/SQL. И не нашел. Что до сих пор для меня кажется удивительным. Но, как гласит одна древняя китайская мудрость: Дорогу молодым! Пришлось наскоро пилить собственный вариант.
formatprg
Vim не был бы Vim-ом если бы не умел что-то и без плагинов когда дело касается манипуляций с текстом. А как назвать форматирование если не манипуляцией над текстом. Во-первых, есть встроенная команда :filter
которая либо запускает встроенную функцию, либо скармливает в stdin внешней программе, указанной в опции equalprg
, диапазон либо выделение, и вставляет обратно результат из stdout. Но её принято использовать для каких-то функций типа сортировки, подсчета слов и всякого стандартного из арсенала POSIX.
А конкретно для форматирования предусмотрена еще одна встроенная приблуда вызываемая сочетанием gq
. Она ровно так же как фильтр имеет свою пару опций formatexpr
и formatprg
действующих по похожему принципу. Первая опция, если она задана, вызывает некую внутреннюю команду, а formatprg
— внешнюю программу, так же работающую со стандартными потоками ввода вывода. Рассмотренный coc.nvim
в общем-то по умолчанию и устанавливает в formatexpr
свою функцию. В этом можно убедиться вызвав :set formatexpr
либо воспользовавшись, собственно, gq
на выделении или на последующем движении.
Таким образом, что бы воспользоваться сторонним решением для форматирования достаточно иметь в путях соответствующую консольную программу и установить соответствующую опцию. Чем немедленно было решено воспользоваться. Оставалось только найти подходящую программу.
SQLCli
И в очередной раз Oracle «не подвел». Oracle просто не сделал такую программу, и, судя по всему, не собирается. (Ведь все разработчики под Oracle должны работать с безобразными и гигантскими решениями сугубо от Oracle или Toad). Наименьшим из зол на данным момент оказался некий консольный вариант Oracle SQL Developer, который в отличие от SQL*Plus, хотя бы отдаленно пытается быть дружелюбным к пользователю. И в числе прочего имеет таки внутри себя функцию форматирования, работающую на механизме, используемом в SQL Developer.
Но, опять же, с нюансами. Во-первых, в него никаким образом нельзя подсунуть стандартный поток ввода. (Я по крайней мере не смог). Во-вторых, оказалось архисложно заставить его замолчать и не выводить ничего в вывод. Тем не менее с помощью говна и палок, удалось сделать обертку, которая приближенно напоминает искомый результат.
Назвал я её незатейливо sqlcl-formatter-wrapper и выложил на GitHub. Как и упоминалось, с ним я всё еще вожусь, и поэтому как положено ничего не оформлено. Вкратце нужно отдельно установить SQLCli либо взять путь установленного у вас SQL Developer.
$ git clone https://github.com/johnrembo/sqlcl-formatter-wrapper.git
И указать в скрипте sqlaf
путь к бинарному sql
(для SQL Developer это скорее всего /opt/sqldeveloper/sqldeveloper/bin/sql
). Настройка Vim еще проще — у меня это выглядит как две дополнительные инструкции в файле ~/.vim/coc.vim
.
autocmd FileType sql,plsql setlocal formatprg=~/src/sqlcl-formatter-wrapper/sqlaf autocmd FileType sql,plsql setlocal formatexpr=
Вторая строка отключает форматировщик coc-sql, так как formatexpr
имеет более высокий приоритет. Родное сочетание <leader>lf
при этом будет работать так же как и раньше. А обертку можно будет вызывать отдельно с помощью стандартного gq
.
Настраивается форматирование путем редактирования приложенного файла af.xml
либо, опять же, можно взять его из SQL Developer, если он у вас есть, предварительно натыкав в нем мышкой нужные пункты.
Есть и известные болячки. Форматирует более или менее родной форматировщик не плохо, но всё-таки всё-равно не идеально. Не так как я это себе представляю. Но это уже моя личная боль. Так же SQLCli будучи java приложением запускается очень не мгновенно и жать форматирование чаще чем перед сохранением я бы не стал. Есть мысль запустить SQLCli отдельно в качестве некоего демона и кормить его в памяти, но руки пока не доходят.
Еще один досадный недостаток — SQLCli, когда не понимает что делать с поломанным синтаксисом выплевывает вместо исходника текст ошибки прямо в поток вывода. Видел я и на этот случай костыли, но пока до них не добрался да и не так это мешает, если форматированию подвергать только компилируемый и выполняющийся код. Да и отменить в общем недолго. Но и над этим надо будет поработать если захочется в итоге упаковать это решение как плагин.
И снова это скорее мечты, которые, как говорит еще одна китайская мудрость, не вредны. На чем сегодня позвольте откланяться. Далее будет некий перерыв, потому что с PHP и DAP я пока не сильно и сам разобрался. Как будут какие-то выходящие за рамки готовых решений обязательно отпишусь. А пока не теряйте, есть немало вещей о которых я пописываю и в основном своем бложике на злосчастном Дзене.
:noa :xa
Форматирование строк. Метод format | Python 3 для начинающих и чайников
Иногда (а точнее, довольно часто) возникают ситуации, когда нужно сделать строку, подставив в неё некоторые данные, полученные в процессе выполнения программы (пользовательский ввод, данные из файлов и т. д.). Подстановку данных можно сделать с помощью форматирования строк. Форматирование можно сделать с помощью оператора %, либо с помощью метода format.
Если для подстановки требуется только один аргумент, то значение — сам аргумент:
>>> 'Hello, {}!'.format('Vasya') 'Hello, Vasya!'
А если несколько, то значениями будут являться все аргументы со строками подстановки (обычных или именованных):
>>> '{0}, {1}, {2}'. format('a', 'b', 'c') 'a, b, c' >>> '{}, {}, {}'.format('a', 'b', 'c') 'a, b, c' >>> '{2}, {1}, {0}'.format('a', 'b', 'c') 'c, b, a' >>> '{2}, {1}, {0}'.format(*'abc') 'c, b, a' >>> '{0}{1}{0}'.format('abra', 'cad') 'abracadabra' >>> 'Coordinates: {latitude}, {longitude}'.format(latitude='37.24N', longitude='-115.81W') 'Coordinates: 37.24N, -115.81W' >>> coord = {'latitude': '37.24N', 'longitude': '-115.81W'} >>> 'Coordinates: {latitude}, {longitude}'.format(**coord) 'Coordinates: 37.24N, -115.81W'
Однако метод format умеет большее. Вот его синтаксис:
поле замены ::= "{" [имя поля] ["!" преобразование] [":" спецификация] "}" имя поля ::= arg_name ("." имя атрибута | "[" индекс "]")* преобразование ::= "r" (внутреннее представление) | "s" (человеческое представление) спецификация ::= см. ниже
Например:
>>> "Units destroyed: {players[0]}".format(players = [1, 2, 3]) 'Units destroyed: 1' >>> "Units destroyed: {players[0]!r}". 'Выравнивание по центру. Опция "знак" используется только для чисел и может принимать следующие значения:
Флаг | Значение |
'+' | Знак должен быть использован для всех чисел. |
'-' | '-' для отрицательных, ничего для положительных. |
'Пробел' | '-' для отрицательных, пробел для положительных. |
Поле "тип" может принимать следующие значения:
Тип | Значение |
'd', 'i', 'u' | Десятичное число. |
'o' | Число в восьмеричной системе счисления. |
'x' | Число в шестнадцатеричной системе счисления (буквы в нижнем регистре). |
'X' | Число в шестнадцатеричной системе счисления (буквы в верхнем регистре). |
'e' | Число с плавающей точкой с экспонентой (экспонента в нижнем регистре). |
'E' | Число с плавающей точкой с экспонентой (экспонента в верхнем регистре). |
'f', 'F' | Число с плавающей точкой (обычный формат). |
'g' | Число с плавающей точкой. с экспонентой (экспонента в нижнем регистре), если она меньше, чем -4 или точности, иначе обычный формат. |
'G' | Число с плавающей точкой. с экспонентой (экспонента в верхнем регистре), если она меньше, чем -4 или точности, иначе обычный формат. |
'c' | Символ (строка из одного символа или число - код символа). |
's' | Строка. |
'%' | Число умножается на 100, отображается число с плавающей точкой, а за ним знак %. |
И напоследок, несколько примеров:
>>> coord = (3, 5) >>> 'X: {0[0]}; Y: {0[1]}'.format(coord) 'X: 3; Y: 5' >>> "repr() shows quotes: {!r}; str() doesn't: {!s}".format('test1', 'test2') "repr() shows quotes: 'test1'; str() doesn't: test2" >>> '{:<30}'. 30}'.format('centered') # use '*' as a fill char '***********centered***********' >>> '{:+f}; {:+f}'.format(3.14, -3.14) # show it always '+3.140000; -3.140000' >>> '{: f}; {: f}'.format(3.14, -3.14) # show a space for positive numbers ' 3.140000; -3.140000' >>> '{:-f}; {:-f}'.format(3.14, -3.14) # show only the minus -- same as '{:f}; {:f}' '3.140000; -3.140000' >>> # format also supports binary numbers >>> "int: {0:d}; hex: {0:x}; oct: {0:o}; bin: {0:b}".format(42) 'int: 42; hex: 2a; oct: 52; bin: 101010' >>> # with 0x, 0o, or 0b as prefix: >>> "int: {0:d}; hex: {0:#x}; oct: {0:#o}; bin: {0:#b}".format(42) 'int: 42; hex: 0x2a; oct: 0o52; bin: 0b101010' >>> points = 19.5 >>> total = 22 >>> 'Correct answers: {:.2%}'.format(points/total) 'Correct answers: 88.64%'
Для вставки кода на Python в комментарий заключайте его в теги <pre><code>Ваш код</code></pre>
Полный или быстрый формат: что выбрать?
Что такое форматирование диска?
Говоря простым языком, форматирование диска — это своего рода подготовка устройства хранения данных (например, внешнего или внутреннего HDD или SSD или флешки) к использованию. Обычно это трехэтапный процесс, состоящий из низкоуровневого форматирования, разбиения на разделы и высокоуровневого форматирования.
Низкоуровневый — это физический тип форматирования, обычно выполняемый производителем. Он заключается в делении чистого диска на цилиндры, дорожки и сектора по 512 или 4096 байт или 520 байт в случае дисков SAS. При выполнении на диске с данными все его файлы безвозвратно стираются. Низкоуровневое форматирование — это не то, что должен делать обычный пользователь, и даже более того, его не следует делать на регулярной основе, так как это может повредить накопитель и сократить срок его службы.
Разделение , в свою очередь, может управляться пользователем. По сути, это разделение диска на одну или несколько логических частей, так называемых разделов. Это делается для удобства и для увеличения производительности диска.
И последнее, но не менее важное: высокоуровневое или логическое форматирование . Это как раз то, что большинство пользователей имеют в виду, когда говорят «форматирование». Это процесс генерации загрузочной информации, записи файловой системы, разделения диска на кластеры и так далее. Кластер — это логическая единица хранения данных в таблице размещения файлов, объединяющая группу секторов. Например, на диске с секторами по 512 байт кластер размером 512 байт содержит 1 сектор, а кластер размером 4 КБ — 8 секторов.
Логический тип форматирования в основном выполняется пользователем для того, чтобы:
- ввести в эксплуатацию новый диск;
- переустановить операционную систему;
- изменить файловую систему или размер диска;
- избавиться от нескольких вирусов;
- получить доступ к недоступному диску.
В общем случае можно выполнить двумя способами: быстрым и полным (или общим).
Полное и быстрое форматирование. В чем разница?
Как следует из названия, быстрое форматирование выполняется быстрее, чем полное. При выборе параметра «Быстрое форматирование» данные «удаляются», таблица разделов перестраивается и файловая система заменяется. Однако этот тип формата не подразумевает реального удаления данных. Фактически удаляется только журнал с информацией о файлах и их расположении на диске. Так, после быстрого форматирования данные становятся недоступными для пользователя, но остаются на диске и могут быть восстановлены с помощью специальной программы восстановления данных.
При запуске полного формата файлы полностью удаляются, а сам диск дополнительно сканируется на битые сектора. Если есть какие-либо логические поврежденные сектора, они будут исправлены в процессе. Собственно, это сканирование и является одним из факторов, делающих полный формат в два раза длиннее быстрого. Кроме того, когда диск полностью отформатирован, его таблица разделов перезаписывается, независимо от того, является ли это MBR (главная загрузочная запись), GPT (схема разделов GUID) или APM (карта разделов Apple), а предыдущая файловая система заменяется на новенький. Итак, после полного форматирования все данные удаляются из хранилища и не могут быть восстановлены программами для восстановления данных.
Подведем итоги. Если вам нужно отформатировать совершенно новое устройство хранения данных, вы должны выполнить полное форматирование. Но если ваш диск уже был отформатирован и вы абсолютно уверены, что на нем нет поврежденных или логически поврежденных секторов, достаточно будет быстрого форматирования. Тем не менее, обратите внимание, что сбойные сектора могут повредить ваш диск, и если какая-то информация будет сохранена в таком секторе, она может быть прочитана с ошибками или даже быть повреждена. Так что, если вы сомневаетесь, есть ли на вашем диске логически поврежденные сектора, вам лучше выбрать полный вариант.
И перед продажей или подарком вашего диска мы настоятельно рекомендуем вам тщательно удалить всю конфиденциальную информацию, выполнив полное форматирование.
Как сделать резервную копию внешнего жесткого диска перед его форматированием
Мы часто используем внешний жесткий диск для хранения или резервного копирования ценных данных на компьютере. Но знаете ли вы, что для обеспечения безопасности данных также необходимо сделать резервную копию вашего внешнего жесткого диска ?
Зачем нужно делать резервную копию внешнего жесткого диска?
Внешний жесткий диск подвержен риску форматирования, что является одной из основных причин, по которой вам необходимо сделать его резервную копию.
1. Внешний жесткий диск переносной, поэтому его можно использовать на разных компьютерах. При постоянном «подключении» и «вытаскивании» это может привести к ошибкам, и вам придется форматировать весь внешний диск, чтобы исправить ошибки привода.
2. Иногда может потребоваться изменить способ использования внешнего жесткого диска, например создать с ним загрузочный диск, который отформатирует внешний диск.
Форматирование внешнего жесткого диска приведет к потере всех данных, хранящихся на нем, и их будет трудно восстановить. Таким образом, необходимо сделать резервную копию внешнего жесткого диска перед его форматированием.
Как создать резервную копию внешнего жесткого диска перед его форматированием
Резервное копирование — это не просто копирование всех файлов, хранящихся на внешнем жестком диске, в другое место. Хотя это возможно, это занимает много времени и очень затрудняет сохранение копии данных. Чтобы упростить процесс резервного копирования внешнего жесткого диска, мы настоятельно рекомендуем вам использовать профессиональное программное обеспечение для резервного копирования iSumsoft Cloner. Это позволяет легко создавать резервные копии всего внешнего жесткого диска в виде одного файла и восстанавливать все данные из резервной копии при необходимости. Следуй этим шагам.
Шаг 1: Загрузите iSumsoft Cloner и установите его на свой компьютер с Windows.
Шаг 2: Подключите внешний жесткий диск к компьютеру через разъем USB, а затем запустите iSumsoft Cloner.
Шаг 3: Выберите опцию Backup слева. Выберите том внешнего жесткого диска для резервного копирования, выберите путь для сохранения файла резервной копии, нажав кнопку Choose , а затем нажмите Start , чтобы начать резервное копирование.
Наконечники: Убедитесь, что в месте назначения достаточно места для сохранения резервной копии. Вы можете сделать резервную копию внешнего жесткого диска на другой внешний жесткий диск или на внутренний жесткий диск компьютера.
Шаг 4: Просто дождитесь завершения процесса резервного копирования. Это занимает около десяти минут, в зависимости от размера используемого пространства на внешнем жестком диске. По завершении резервного копирования вы можете безопасно отформатировать внешний жесткий диск, не беспокоясь о потере данных.
Как восстановить все данные из резервной копии внешнего жесткого диска
Как указывалось ранее, весь внешний жесткий диск резервируется как один файл ( *.icg ). Вы можете использовать файл резервной копии для восстановления всех ваших данных.
1. Запустите iSumsoft Cloner на своем компьютере.
2. Выберите параметр Восстановить слева. Выберите место, в которое вы хотите восстановить резервную копию, выберите файл резервной копии на внешнем жестком диске, нажав кнопку Choose , а затем нажмите Start , чтобы начать восстановление данных.