- Нет асинхронности. Знаю что есть nvim — но он работает не так быстро и не так гладко
- Сложность написания плагинов. Спорный конечно вопрос для разных гуру — но честно говоря так много «каши», не хватает модульности и какой то структурности из уже реализованных «велосипедов»
- Когда слишком много плагинов vim стартует — нужно быть честным, довольно долго и это напрягает
Пользуюсь так же по основному своему хобби — Android Studio. Очень прожорлив этот IDE к ресурсам системы, процессор иногда сходит с ума обрабатывая очередной цикл gradle assembleDebug.
Visual Studio Code испытывал скептически. Первое что удивило скорость запуска вместе с большой структурой проекта. Моментальный поиск по файлам и множество плагинов, отличный менеджер плагинов похожий на Sublime. Минимальная загрузка процессора.
Давно в Android Studio не хватало одной полезной штуки — перевод ресурсов strings.xml под другие языки. Делать раньше это было весьма неудобно:
- Выделить текст
- Скопировать
- Перейти в любой онлайн переводчик
- Вставить текст
- Выбрать текущий язык перевода
- Выбрать в какой язык перевести
- Скопировать перевод
- Открыть результирующий strings.xml
- Вставить перевод
Чего хотелось — одной комбинацией клавиш получить моментальный результат.
Честно говоря искал сразу похожий плагин под vim, он нашелся достаточно быстро, но его реализация похоже устарела и была актуальна на то время, когда google-translate online был бесплатным для использования в режиме «запрос — ответ».
Visual Studio Code обладает своим маркетом. Поиск плагина для переводов дал один результат, но это был не тот переводчик который я себе представлял — перевод с традиционного китайского на упрощенный китайский как то не особо устраивал мои запросы.
Поэтому я приступил к реализации собственного плагина. Начал с того, что искал сервис, который поможет решить основную задачу — перевести текст. Таким сервисом, к счастью, оказался translate.yandex.ru.
Плюсом оказалось так же тот факт, что пакетный менеджер для node.js быстро нашел уже реализованный модуль для сервиса Yandex Translate.
Ну что же — осталось написать сам плагин для Visual Studio Code.
Базовая структура и описание хорошо документированы и не представляли сложности подготовки к реализации.
TypeScript был для меня нечто новым, до этого использовал чистый node.js для достаточно большого проекта учета статистических данных.
Остановлюсь на моментах которые представляли сложность. В node.js для того что бы обработать асинхронно какой то процесс удобно использовать библиотеку async. Очень удобен особенно метод async.map который позволяет передать массив данных которые нужно обработать и на выходе получить массив результатов.
Выглядит это дело приблизительно так:
var async = require('async');
async.map(['test1','test2','test3'], test, function(err, results){
console.log(results);
});
function test(item) {
return item;
}
Для чего мне нужна была подобная структура — что бы передать массив выделенных строк в функцию перевода, затем перевести каждую и результатом заменить целевые строки расположенные между тегами
<item>string to translate</item>
которые расположены в ресурсе строк strings.xml android проекта.Но, как оказалось можно использовать Promise:
async function processData(data: any[]) {
const promises = data.map(async (item) => {
await doSomeAsyncStuff(item);
// здесь Вы можете продолжать работать дальше с `item`
});
await Promise.all(promises);
// дальнейший код будет вызван после того как все асинхронные коды выполнятся
}
async function doSomeAsyncStuff(value) {
return new Promise((resolve, reject) => {
// вызывайте любую асинхронную библиотеку или к примеру setTimeout а дальше resolve(подтвердите) или reject(отклоните) promise (обещание)
});
}
Что это дало — в итоге размер плагина уменьшился на 2Мб, так как не пришлось подтягивать async пакет для node.js
В процессе реализации плагина наткнулся на проблему — в режиме отладки всё работало идеально. Когда собрал плагин — поспешил его выложить в маркет студии. Как это сделать не спеша описано в инструкции.
К чему привело — ошибка при запуске любой команды расширения: «An extension might be missing an activation event.»
Почему так происходило — система не находила имени action команды которое прописано в файлах основного кода и настраиваемого файла package.json расширения. На самом деле все имена совпадали — а соль была в том что изначально подтянул не ту библиотеку async используя устаревшую node-async которая давала сбой при инициализации. В результате и та и другая библиотека async была удалена из зависимостей по причине использования Promise.
Итог реализации
Запустив Visual Studio Code нажимаем Ctrl+P и вставляем «ext install yandex-translate». После установки студия предложит «Перезагрузить» что бы применить расширение к своей оболочке. После перезагрузки берем любой файл в котором нужно что либо перевести, нажимаем F1 выбираем Yandex translate selected, либо же комбинация клавиш Ctrl+t.
Можно указывать с какого языка на какой осуществлять перевод комбинацией клавиш Ctrl+shift+t либо F1 -> Yandex choose languages
В файлах strings.xml выделив необходимые строки и нажав комбинацию Ctrl+alt+t получим перевод всех строк заключенных между элементами:
<item>string to translate</item>
На всякий случай реализовал смену Yandex Api Key — вдруг по одному и тому же ключу можно делать ограниченное количество переводов. Тогда можно будет сменить ключ на свой.
Все! Удачного перевода.
Ссылки:
Visual Studio Code
Описание системы расширений для Visual Studio Code
Расширение yandex-translate в маркете
Проект расширения yandex-translate на Github
Комментарии (18)
stas404
10.05.2016 21:42Наткнулся не так давно на упоминание, что сейчас гугловцы во главе с тем самым Raph Levien пилят некий «Xi editor» на rust. Обещают, мол, круто и производительно все будет, но до нормального релиза ждать еще долго. Тем не менее, 4K звезд им уже понатыкали на github. В общем, если кому интересно будет:
https://github.com/google/xi-editortgsoft
10.05.2016 22:59Пока что этот редактор не универсален для задач под разные системы. Интересно почему такая цифра — мол все должно быть быстрее 16 мс — любая операция. Откуда такая цифра? Преимущество node.js в асинхронности операций. Rust асинхронный? Умеет работать с callback? Основной ли это его принцип при обработке длительных операций?
stas404
10.05.2016 23:27Возможно, эта цитата по ссылке что-то прояснит:
Asynchronous operations. The editor should never, ever block and prevent the user from getting their work done. For example, autosave will spawn a thread with a snapshot of the current editor buffer (the peristent rope data structure is copy-on-write so this operation is nearly free), which can then proceed to write out to disk at its leisure, while the buffer is still fully editable.
appsforlife
11.05.2016 01:00+1все должно быть быстрее 16 мс — любая операция. Откуда такая цифра?
это дает 60 fps
xvilka
11.05.2016 07:50Пока он слишком сырой, но имеет смысл, так как код писать на Rust приятней намного, и он более лаконичен получается. Имхо, если neovim не взлетит (а он пока ни шатко, ни валко развивается, но сильно далеко от заявленных при краудфандинге планов), то это ему достойная замена.
Kuprijan
10.05.2016 22:52На такой случай я пользуюсь QTranslate — делает ту же фигню, с любым языком, с любым редактором/IDE, и не только yandex'ом — но только windows, до этого устанавливал плагин в Visual Studio, который делал то-же самое, но перевод был только с одного языка…
tgsoft
10.05.2016 22:54Уверен есть удобные решения под любые задачи, тут речь идет о кроссплатформенности — возможность использования под любой системой. Интересно кстати какие еще знаете ресурсы онлайн перевода?
Kuprijan
10.05.2016 23:30Больше не знаю. Но хотелось бы тоже знать альтернативы — если такие существуют, мало ли что… А о предыдущем сабже — автор намекает, — что планов на Linux и другие платформы нет — что жалко(
Kuprijan
15.05.2016 14:19Только что лазил по торренту (те кто будет плеваться на счёт лицензии — freeware) — Dicter. Также, у кого установлен PROMPT, есть агент, который висит в трее, и переводит текст по double control
dzigoro
11.05.2016 01:28Для IntelliJ Idea разработан аналогичный плагин
tgsoft
11.05.2016 07:45Загрузил этот плагин сначала на диск. Потом через AndroidStudio выбрал Настройки-Плагины-Установить с диска. В итоге мы имеем всего лишь подсветку в выпадающем окне значения слова.
Плагин же разработанный для vscode умеет переводить и заменять слова on the fly +умная замена в ресурсах strings.xml именно между тегами<item>test</item>
не затрагивая сами тэги xml, что очень удобно — если выбрать все строки и нажать перевод.
xvilka
Почему бы не использовать Atom тогда?
tgsoft
Атом тоже на борту, но грузит систему. Вот есть сравнение пользователя к примеру atom vs code.
xvilka
Мда, «атомным» разработчикам есть куда стремиться в ускорении.