Страницы

Поиск по вопросам

Показаны сообщения с ярлыком sublime-text-3. Показать все сообщения
Показаны сообщения с ярлыком sublime-text-3. Показать все сообщения

четверг, 9 апреля 2020 г.

Автодополнение для Си

#c #sublime_text #sublime_text_3

                    
Меня интересует автодополнение кода для Си в Sublime Text 3. Мне нужно, чтобы после
подключения заголовка какой-то плагин давал подсказки, подобно intellisense из Visual
Studio. Я "нагуглил" какие-то Clang autocomplete и тому подобное, но они нормально
не работают. 

Все мои плагины:



Из автодополнений у меня есть ключевые слова а-ля struct, typedef, типы переменных
etc. Но нет автодополнения (или, можно сказать, подсказок) по подключаемым файлам.
Например, тот же stdio.h — у меня автоподолнение только ОДНОЙ функции printf.
    


Ответы

Ответ 1



Попробуйте вот это. Он, технически, должен выбирать все функции, из заголовков, что у вас подключены. Подробнее про установку на Хабре. Если у вас линукс, то можно заставить его работать под ST3, но вроде бы и под виндой можно.

суббота, 4 апреля 2020 г.

Автоматическое изменение цвета у заданных слов в Sublime Text

#sublime_text #sublime_text_3

                    
Необходимо, чтобы, например, набор символов тест в документах, открытых Sublime Text
3, всегда был оранжевого цвета; <пример> — красного, @stackoverflow — синего и т. п.
. Не подсветка, а именно другой цвет. Особо не имеет значения, сразу во всех цветовых
схемах или же только в той, которой пользуюсь.

Цель — хочется простенький ToDo-менеджер прямо в Sublime Text, где разноцветные слова
выполняли бы роль тегов, по которым легко ориентироваться. ToDo-плагин PlainTasks не
устраивает.

Возможно ли так сделать?
    


Ответы

Ответ 1



Решение проверено в Windows XP и новейшей (на март 2016) версии редактора — Sublime Text 3 Build 3103. Если установлена более старая версия Sublime Text 3, скачиваем Build 3103 с официального сайта, для 64-битной Windows и других операционных систем ссылки тут. В верхнем меню Sublime Text 3 открываем Preferences ► Browse Packages... , в папке User создаём файл ToDo Manager.sublime-settings, куда копируем следующее содержимое: %YAML 1.2 --- # http://www.sublimetext.com/docs/3/syntax.html name: ToDo Manager file_extensions: - task scope: text.task contexts: main: - match: (?i)@Работа scope: meta.work - match: (?i)@Проект1 scope: meta.project1 - match: (?i)@Срочно scope: meta.avral Где ToDo Manager — имя файла подсветки, которое должно совпадать с именем до расширения .sublime-settings только что созданного нами в папке User файла; task — расширение файлов, при открытии которых программой Sublime Text 3 будет функционировать наша подсветка, должно совпадать со словом после scope: text. в следующей строке (не поставил расширение todo, поскольку оно уже зарезервировано плагином ). Если теги нашего ToDo-менеджера будут иметь вид @'Название тега', вписываем их, как в примере выше, желаете по-другому — используйте вместо @ свой вариант. Взамен work, project1 и avral можно вписать любые значения, лишь бы они совпадали с дальнейшей вставкой. Как лучше всего подобрать цветовую схему для Sublime Text 3. Переходим на страницу онлайн-сервиса TmTheme Editor, в левом меню выбираем предпочтительную цветовую схему, настраиваем её в зависимости от наших пожеланий. Доступен предпросмотр цветов и подсветки для различных языков разметки/программирования: TmTheme Editor http://pokit.org/get/img/4ba225a894915a99fbc8dacf4367e80b.jpg Save ► Download — сохраняем файл в папку, где хранятся цветовые схемы: Preferences ► Browse Packages... ► User. Переключение на схему осуществляется посредством Preferences ► Color Scheme ► User. Перед следующими строками в конце файла цветовой схемы uuid 6B90703E-4E4B-43C8-9D32-921BEDF6D725 colorSpaceName sRGB semanticClass theme.dark.espresso_libre вставляем текст: name work scope meta.work settings background fontStyle foreground Yellow name project1 scope meta.project1 settings background fontStyle foreground #00FF00 name avral scope meta.avral settings background fontStyle foreground Red Значения должны совпадать с теми, что мы вписывали в файл ToDo Manager.sublime-settings. Между тегами вводим цвета. Лучше прописывать их в HEX, а не X11 colors, поскольку в Sublime Text 3 могут некорректно отображаться как минимум цвета aqua, fuchsia и lime. Для подсветки цветов в форматах HEX и RGB служит плагин ColorHighlighter. Самый простой способ установки — через Package Control: в Sublime Text 3 нажимаем Ctrl+Shift+P ► в открывшуюся строку вводим Package Control: Install Package ► среди всплывающих вариантов выбираем соответствующий пункт ► теперь вводим в ту же строку Color Highlighter ► среди всплывающих вариантов выбираем соответствующий пункт ► плагин установлен. Создаём файл с расширением .task . Открываем его нашим Sublime Text 3, выполняем: View ► Syntax ► Open all with current extension as... ► User ► ToDo Manager. Пробуем в этом же файле, что у нас получилось: Всё, раскрашиваем содержимое task-файлов, как душе угодно. Спасибо за подробное объяснение ув-мому Мэтту Моррисону.

воскресенье, 8 марта 2020 г.

Не работает русская клавиатурная раскладка в сочетаниях горячих клавиш Sublime Text 3

#sublime_text #sublime_text_3


Установил плагин Markdown Editing, синтаксис Markdown GFM. Хочу обернуть текст в
код или квадратные скобки. Когда нахожусь в английской клавиатурной раскладке, проблем
не возникает:



Но когда раскладка русская, я уже не могу обернуть текст:



Это неудобно, раздражает. Причём такое сразу с несколькими плагинами: в английской
раскладке горячие клавиши работают, а в русской нет.

Подскажите, что делать?
    


Ответы

Ответ 1



1. Суть проблемы Откроем консоль: Ctrl+` (машинописный обратный апостроф, символ расположен на той же клавише, где кириллическая «ё») → вводим в открывшееся поле sublime.log_input(True). Нажмём сначала Ctrl+k в английской раскладке, затем Ctrl+л в русской. Посмотрим, что выведется в консоли: key evt: control+k key evt: control+k Если с системой нет проблем, результат должен быть аналогичным. А теперь нажмём k в английской, потом л в русской. chr evt: k (0x6b) chr evt: л (0x43b) Sublime Text воспринимает k и л как разные символы, если они нажимаются не вместе со служебными клавишами. Если используется двойное нажатие хоткеев, Ctrl+k,k и Ctrl+л,л Sublime Text также видит по-разному. Т.е. когда в качестве шортката используется одинарный символ, чтобы результат в русской раскладке был таким же, как в английской, придётся раскладку переключать. Так что если будете сами задавать сочетание для команды, без использования служебных клавиш, продублируйте запись и для русской раскладки, пример: // Предпросмотр вики-страницы в плагине Mediawiker { "keys": ["ctrl+7", "p"], "command": "mediawiker_preview" }, { "keys": ["ctrl+7", "з"], "command": "mediawiker_preview" }, 2. Попытки урегулирования проблемы с разработчиками Заявка в issue tracker Sublime Text висит долгое время, её приоритет обозначен как «minor». Есть предложение использовать в качестве идентификатора клавиши keycode вместо keysym, но по состоянию на сентябрь 2016 оно не реализовано на практике. Разработчик плагинов отказался принимать мой pull request, добавляющий хоткеи для русской раскладки. Значит, придётся настраивать Sublime Text для русской раскладки самостоятельно. 3. Решение На примере плагина BetterFindBuffer. Устанавливаем плагин PackageResourceViewer: Ctrl+Shift+P → PackageResourseViewer:Open Resourse (благодаря fuzzy поиску достаточно набрать просто prvor) → MarkdownEditing → Default.sublime-keymap (иногда Default(ваша операционная система).sublime-keymap) → в открывшемся файле ищем шорткаты, состоящие из одного символа, которого в русской раскладке нет или же он расположен на другой клавише. Пример: { "keys": ["o"], "command": "find_in_files_open_file", "context": [ { "key": "selector", "operator": "equal", "operand": "text.find-in-files" } ] }, Заменяем o на соответствующую ей в русской раскладке букву, это щ: { "keys": ["щ"], "command": "find_in_files_open_file", "context": [ { "key": "selector", "operator": "equal", "operand": "text.find-in-files" } ] }, Preferences → Key Bindings - User → вставляем в открывшийся файл код с буквой щ. Проделываем данное действие со всеми шорткатами без служебных клавиш, где это необходимо. После того, как произвели действия, проверьте, всё ли работает нормально. Пример: в Preferences → Key Bindings - Default есть такой код: { "keys": ["\""], "command": "insert_snippet", "args": {"contents": "\"$0\""}, "context": [ { "key": "setting.auto_match_enabled", "operator": "equal", "operand": true }, { "key": "selection_empty", "operator": "equal", "operand": true, "match_all": true }, { "key": "following_text", "operator": "regex_contains", "operand": "^(?:\t| |\\)|]|\\}|>|$)", "match_all": true }, { "key": "preceding_text", "operator": "not_regex_contains", "operand": "[\"a-zA-Z0-9_]$", "match_all": true }, { "key": "eol_selector", "operator": "not_equal", "operand": "string.quoted.double - punctuation.definition.string.end", "match_all": true } ] }, (\" — символ "кавычки-ёлочки". Для использования кавычки как литерала в JSON-файлах требуется её экранировать.) Вы вставили в свой кеймап: { "keys": ["э"], "command": "insert_snippet", "args": {"contents": "\"$0\""}, "context": [ { "key": "setting.auto_match_enabled", "operator": "equal", "operand": true }, { "key": "selection_empty", "operator": "equal", "operand": true, "match_all": true }, { "key": "following_text", "operator": "regex_contains", "operand": "^(?:\t| |\\)|]|\\}|>|$)", "match_all": true }, { "key": "preceding_text", "operator": "not_regex_contains", "operand": "[\"a-zA-Z0-9_]$", "match_all": true }, { "key": "eol_selector", "operator": "not_equal", "operand": "string.quoted.double - punctuation.definition.string.end", "match_all": true } ] }, Но теперь когда вы просто вводите букву э, вводятся двойные кавычки. Код с буквой э не нужен, удаляем его из нашего файла. Проверяем — буква э пишется теперь нормально. Если после ваших действий с назначением команд клавишам русской раскладки символы русской раскладки заработают неправильно, значит, скорее всего, вы вставили лишнее, подлежащее удалению. 4. Поддержка русской раскладки для дефолтных хоткеев без служебных клавиш Можно добавлять строки ниже в файл, открывающийся после Preferences → Key Bindings - User, сразу после установки Sublime Text, чтобы не приходилось переключаться при оборачивании текста в различные виды кавычек и скобок, а также при использовании Vintage Mode. Проверял, ошибок возникнуть не должно. Обёртка текста в скобки и кавычки // // // Дефолтные сочетания в русской раскладке клавиатуры // // // Выделение {фигурными скобками} { "keys": ["Х"], "command": "wrap_block", "args": {"begin": "{", "end": "}"}, "context": [ { "key": "indented_block", "match_all": true }, { "key": "setting.auto_match_enabled", "operator": "equal", "operand": true }, { "key": "selection_empty", "operator": "equal", "operand": true, "match_all": true }, { "key": "following_text", "operator": "regex_match", "operand": "^$", "match_all": true }, ] }, { "keys": ["Х"], "command": "insert_snippet", "args": {"contents": "{${0:$SELECTION}}"}, "context": [ { "key": "setting.auto_match_enabled", "operator": "equal", "operand": true }, { "key": "selection_empty", "operator": "equal", "operand": false, "match_all": true } ] }, { "keys": ["Ъ"], "command": "move", "args": {"by": "characters", "forward": true}, "context": [ { "key": "setting.auto_match_enabled", "operator": "equal", "operand": true }, { "key": "selection_empty", "operator": "equal", "operand": true, "match_all": true }, { "key": "following_text", "operator": "regex_contains", "operand": "^\\}", "match_all": true } ] }, // Выделение "кавычками-ёлочками" { "keys": ["Э"], "command": "insert_snippet", "args": {"contents": "\"${0:$SELECTION}\""}, "context": [ { "key": "setting.auto_match_enabled", "operator": "equal", "operand": true }, { "key": "selection_empty", "operator": "equal", "operand": false, "match_all": true } ] }, { "keys": ["Э"], "command": "move", "args": {"by": "characters", "forward": true}, "context": [ { "key": "setting.auto_match_enabled", "operator": "equal", "operand": true }, { "key": "selection_empty", "operator": "equal", "operand": true, "match_all": true }, { "key": "following_text", "operator": "regex_contains", "operand": "^\"", "match_all": true }, { "key": "selector", "operator": "not_equal", "operand": "punctuation.definition.string.begin", "match_all": true }, { "key": "eol_selector", "operator": "not_equal", "operand": "string.quoted.double - punctuation.definition.string.end", "match_all": true }, ] }, // Выделение 'одинарными кавычками' { "keys": ["э"], "command": "insert_snippet", "args": {"contents": "'${0:$SELECTION}'"}, "context": [ { "key": "setting.auto_match_enabled", "operator": "equal", "operand": true }, { "key": "selection_empty", "operator": "equal", "operand": false, "match_all": true } ] }, { "keys": ["э"], "command": "move", "args": {"by": "characters", "forward": true}, "context": [ { "key": "setting.auto_match_enabled", "operator": "equal", "operand": true }, { "key": "selection_empty", "operator": "equal", "operand": true, "match_all": true }, { "key": "following_text", "operator": "regex_contains", "operand": "^'", "match_all": true }, { "key": "selector", "operator": "not_equal", "operand": "punctuation.definition.string.begin", "match_all": true }, { "key": "eol_selector", "operator": "not_equal", "operand": "string.quoted.single - punctuation.definition.string.end", "match_all": true }, ] }, // Выделение [квадратными скобками] { "keys": ["х"], "command": "insert_snippet", "args": {"contents": "[$SELECTION]$0"}, "context": [ { "key": "setting.auto_match_enabled", "operator": "equal", "operand": true }, { "key": "selection_empty", "operator": "equal", "operand": false, "match_all": true }, { "key": "selector", "operator": "equal", "operand": "text.html.markdown", "match_all": true } ] }, { "keys": ["х"], "command": "insert_snippet", "args": {"contents": "[${0:$SELECTION}]"}, "context": [ { "key": "setting.auto_match_enabled", "operator": "equal", "operand": true }, { "key": "selection_empty", "operator": "equal", "operand": false, "match_all": true } ] }, { "keys": ["ъ"], "command": "move", "args": {"by": "characters", "forward": true}, "context": [ { "key": "setting.auto_match_enabled", "operator": "equal", "operand": true }, { "key": "selection_empty", "operator": "equal", "operand": true, "match_all": true }, { "key": "following_text", "operator": "regex_contains", "operand": "^\\]", "match_all": true } ] }, Vintage Mode Вставляем отсюда, (на всякий случай архивная копия, также см. ответ. 5. Поддержка русской раскладки в некоторых плагинах Чтобы не мучились настраивать русскую раскладку для этих плагинов самостоятельно, готовый код: BetterFindBuffer // BetterFindBuffer, русская раскладка { "keys": ["щ"], "command": "find_in_files_open_file", "context": [ { "key": "selector", "operator": "equal", "operand": "text.find-in-files" } ] }, { "keys": ["ф"], "command": "find_in_files_open_all_files", "context": [ { "key": "selector", "operator": "equal", "operand": "text.find-in-files" } ] }, { "keys": ["т"], "command": "find_in_files_jump_file", "context": [ { "key": "selector", "operator": "equal", "operand": "text.find-in-files" } ] }, { "keys": ["з"], "command": "find_in_files_jump_file", "args": { "forward": false }, "context": [ { "key": "selector", "operator": "equal", "operand": "text.find-in-files" } ] }, { "keys": ["о"], "command": "find_in_files_jump_match", "context": [ { "key": "selector", "operator": "equal", "operand": "text.find-in-files" } ] }, { "keys": ["л"], "command": "find_in_files_jump_match", "args": { "forward": false }, "context": [ { "key": "selector", "operator": "equal", "operand": "text.find-in-files" } ] }, { "keys": ["а"], "command": "bfb_fold_and_move_to_next_file", "context": [ {"key": "selector", "operator": "equal", "operand": "text.find-in-files" } ] }, { "keys": [","], "command": "bfb_toggle_popup_help", "context": [ {"key": "selector", "operator": "equal", "operand": "text.find-in-files" } ] }, Markmon // Markmon, русская раскладка { "keys": ["ctrl+k", "ь"], "command": "markmon_toggle", "args": { "enable": true } }, MarkdownEditing // MarkdownEditing, русская раскладка { "keys": ["ё"], "command": "insert_snippet", "args": {"contents": "`${0:$SELECTION}`"}, "context": [ { "key": "setting.auto_match_enabled", "operator": "equal", "operand": true }, { "key": "selection_empty", "operator": "equal", "operand": false, "match_all": true }, { "key": "selector", "operator": "equal", "operand": "text.html.markdown", "match_all": true } ] }, { "keys": ["ё"], "command": "run_macro_file", "args": {"file": "Packages/MarkdownEditing/macros/Skip Closing Character.sublime-macro"}, "context": [ { "key": "selection_empty", "operator": "equal", "operand": true, "match_all": true }, { "key": "following_text", "operator": "regex_contains", "operand": "^`", "match_all": true }, { "key": "selector", "operator": "equal", "operand": "text.html.markdown", "match_all": true } ] }, { "keys": ["Ё"], "command": "insert_snippet", "args": {"contents": "~~${0:$SELECTION}~~"}, "context": [ { "key": "setting.auto_match_enabled", "operator": "equal", "operand": true }, { "key": "selection_empty", "operator": "equal", "operand": false, "match_all": true }, { "key": "selector", "operator": "equal", "operand": "text.html.markdown", "match_all": true }, { "key": "selector", "operator": "not_equal", "operand": "markup.raw", "match_all": true } ] }, { "keys": ["№"], "command": "insert_snippet", "args": {"contents": "#${0: ${SELECTION/(^ | $)//g} }#"}, "context": [ { "key": "selection_empty", "operator": "equal", "operand": false, "match_all": true }, { "key": "selector", "operator": "equal", "operand": "text.html.markdown", "match_all": true }, { "key": "preceding_text", "operator": "not_regex_contains", "operand": "#{6}", "match_all": true }, { "key": "setting.mde.match_header_hashes", "operator": "equal", "operand": true }, { "key": "selector", "operator": "not_equal", "operand": "markup.raw", "match_all": true } ] }, { "keys": ["№"], "command": "insert_snippet", "args": {"contents": "#${0: ${SELECTION/(^ | $)//g}}"}, "context": [ { "key": "selection_empty", "operator": "equal", "operand": false, "match_all": true }, { "key": "selector", "operator": "equal", "operand": "text.html.markdown", "match_all": true }, { "key": "preceding_text", "operator": "not_regex_contains", "operand": "#{6}", "match_all": true }, { "key": "setting.mde.match_header_hashes", "operator": "equal", "operand": false }, { "key": "selector", "operator": "not_equal", "operand": "markup.raw", "match_all": true } ] }, { "keys": ["№"], "command": "run_macro_file", "args": {"file": "Packages/MarkdownEditing/macros/Padded Headline.sublime-macro"}, "context": [ { "key": "selection_empty", "operator": "equal", "operand": false, "match_all": true }, { "key": "selector", "operator": "equal", "operand": "text.html.markdown", "match_all": true }, { "key": "preceding_text", "operator": "regex_contains", "operand": "#{6}", "match_all": true }, { "key": "following_text", "operator": "regex_contains", "operand": "#+", "match_all": true }, { "key": "setting.mde.match_header_hashes", "operator": "equal", "operand": true }, { "key": "selector", "operator": "not_equal", "operand": "markup.raw", "match_all": true } ] }, { "keys": ["№"], "command": "run_macro_file", "args": {"file": "Packages/MarkdownEditing/macros/Padded Headline.sublime-macro"}, "context": [ { "key": "selection_empty", "operator": "equal", "operand": false, "match_all": true }, { "key": "selector", "operator": "equal", "operand": "text.html.markdown", "match_all": true }, { "key": "preceding_text", "operator": "regex_contains", "operand": "#{6}", "match_all": true }, { "key": "setting.mde.match_header_hashes", "operator": "equal", "operand": false }, { "key": "selector", "operator": "not_equal", "operand": "markup.raw", "match_all": true } ] }, { "keys": ["Ю"], "command": "run_macro_file", "args": {"file": "Packages/MarkdownEditing/macros/Convert to Blockquote.sublime-macro"}, "context": [ { "key": "selection_empty", "operator": "equal", "operand": false, "match_all": true }, { "key": "selector", "operator": "equal", "operand": "text.html.markdown", "match_all": true }, { "key": "selector", "operator": "not_equal", "operand": "markup.raw", "match_all": true } ]

пятница, 31 января 2020 г.

Иконки файлов в сайдбаре Sublime Text 3

#sublime_text #sublime_text_3


Установил новую тему для Sublime Text 3 только ради иконок файлов в Sidebar. Но на
деле оказалось всё не так радужно.
Как должно быть:

  

Как у меня:  

 

Да и иконка .sass не та:

   

То есть Sublime Text не понимает эти типы файлов. И во всех темах есть этот косяк.
Главный трабл в том что я специально скачал чистую portable версию, и даже в ней не
работает. Да и вообще есть несоответствия с многими иконками. В чём может быть проблема?
    


Ответы

Ответ 1



Во-первых, скачаем выбранную Вами Material Theme, перейдём в папку icons и посмотрим, какая иконка соответствует JavaScript. Такая, как на Вашем скриншоте. В истории коммитов копаться неохота, однако предположу, что девелоперы сменили иконку, забыв отразить это в скриншотах на заглавной. Если Вам не нравятся предлагаемые разработчиками тем, можете установить вручную в качестве иконки для используемых Вами языков программирования/разметки и прочих файлов любое изображение. Для начала переместим требуемые изображения в какую-нибудь папку. Ссылки на некоторые наборы иконок выложены в данном треде на форуме Sublime Text, мы воспользуемся файлами из Material Theme, пусть для Sass там выбрана на мой взгляд неудачная иконка. Preferences → Browse Paskages... → User. Создаём папку Theme - Default, если она ещё не создана. Название для папки не я придумал, оно обычно используется. Копируем туда всё — или только изображения, которые пригодятся, — из папки icons Material Theme. Preferences → Browse Paskages... → User → Theme - Default → создаём папку Preferences, в которой будут располагаться файлы, о которых зайдёт речь ниже. В один всё у меня вместить не получается, придётся с каждой иконкой связывать отдельный файл с расширением tmPreferences. Ruby В новый файл Ruby.tmPreferences вставляем XML-конструкцию ниже, и сохраняем его: scope source.ruby settings icon Theme - Default/file_type_ruby Между вторыми тегами указывается путь к файлу иконки и его имя без расширения. Sass Предположу, что Вы получили неудовлетворительные результаты, поскольку не подключили отсутствующий по умолчанию в сборке Sublime Text 3 синтаксис Sass. Через Package Control устанавливаем плагин, который в Package Control (имена плагинов в репозиториях, на сайте Package Control и самом Package Control могут отличаться) называется просто Sass. Теперь можно связывать sass-файлы с иконками. Создаём файл Sass.tmPreferences и вставляем в него код. scope source.sass settings icon Theme - Default/file_type_sass Markdown Здесь между первыми тегами недостаточно по аналогии вписать source.markdown или source.md, и такое может случиться для других языков разметки/программирования. Потребуется вставить «область видимости», scope. Как её получить, я очень подробно расписал в данном ответе. Итак, достаём область видимости: Сколько бы записей в ней не содержалось, нас интересует только первая, text.html.markdown.gfm, которую мы и вставляем в файл Markdown.tmPreferences: scope text.html.markdown.gfm settings icon Theme - Default/file_type_markdown Чтобы не вставлять код каждый раз вручную, рекомендую скачать набор из 70 tm.Preferences файлов для распространённых компьютерных языков. Изображения К примеру, у бинарных, исполняемых файлов или картинок области видимости посмотреть не получится. Чтобы изменить им иконки, необходимо добавить файлы со следующими названиями в папку, где лежит файл активной темы с расширением tmTheme, у меня он располагается по пути Preferences → Browse Paskages... → User. file_type_binary.png file_type_default.png file_type_image.png file_type_markup.png file_type_source.png file_type_text.png Из названий понятно для чего они предназначены. Напротив наших изображений теперь будет стоять иконка с названием file_type_image.png Если сделали всё по данной инструкции, у файлов с соответствующими расширениями в сайдбаре должны появиться вот такие иконки. Буквально во всех темах, которые мне доводилось увидеть, за редким исключением используются одни и те же иконки. В светлых темах многие из них плохо видны, допустим, тот же оранжевый значок JS на жёлтом фоне. А иконки, взятые со сторонних сайтов, выглядят не очень красиво. Легко сменить цвета самому можно, например, в GIMP при помощи функции Hue-Saturation. Открываем в этом графическом редакторе файл иконки → Tools → Color Tools → Hue-Saturation, и двигаем слайдеры, — изменение цвета достигается перемещением ползунка Hue: После того, как подобрали колор, яркость и насыщенность, File → Overwrite file_type_%Ваш тип файла%.png. Примеры изменённых мной таким образом иконок: file_type_js.png file_type_markdown.png file_type_source.png file_type_yaml.png Возможные баги Если вы скачали новую тему или схему, вне зависимости от того, будете ли использовать её или нет, иконки в сайдбаре могут пропасть. В консоли при этом выдаётся примерно следующая ошибка: Errors parsing theme: Rule is missing a class name Unable to decode Packages/User/Theme - Default/arrow_down_over.png pre session restore time: 0.3078 Устраняется проблема в 2 шага: Ctrl+Shift+P → Package Control: Remove Package → выбираем нашу тему/цветовую схему и удаляем её. Можно сообщить о проблеме разработчику темы/схемы. У меня портились файлы с расширением tm.Preferences, о которых говорилось выше. Вместо icons/file_type_ruby появлялись кракозябры. Откройте любой tm.Preferences файл, посмотрите, есть ли там какие-то кракозябры, и если да, то сделайте массовую замену кракозябр на корректные символы в папке, где хранятся tm.Preferences файлы, с помощью поиска Ctrl+Shift+F. После данных действий иконки вновь появлялись в моём сайдбаре.

Ответ 2



На момент написания ответа проблема решается следующим образом: запускаем Package Control: Install package (комбинация клавиш Ctrl+Shift+P) вводим A File Icon в поисковую строку и устанавливаем перезапускаем Sublime Text 3 и иконки автоматически подтягиваются Исходники лежат по ссылке: A File Icon

пятница, 10 января 2020 г.

Завис Sublime Text 3 при работе с внушительным php файлом при сохранении

#sublime_text #sublime_text_3


Собственно, вопрос, что делать? Кто виноват — понятно. Есть ли возможность спасти
скрипт? Может, у Сублайма есть местечко, куда он сохраняет временные файлы? Или другие
варианты? ОС — Ubuntu 14.04.
    


Ответы

Ответ 1



Вопрос решился. Сперва полез смотреть где бы subl мог хранить сессии. Обнаружил их в домашней папке пользователя в каталоге /home/user/.config/sublime-text-3/local. В файле *.sublime_session. Открываю и вижу JSON массив. И, о чудо, вижу знакомый код. Правда идет он одной строкой и символы конца строки проставлены как /n. Отлично, скопировав, решил уйти в ребут, т.к. субл намертво завис и закрываться не хотел даже через htop. После ребута открыл subl и случилось самое величайшее во всей этой истории - последний экземпляр кода висел как несохраненная вкладка. Спасибо команде Sublime! Обновление Ах и еще вот что https://github.com/akalongman/sublimetext-autobackups. Замечательный антисединный плагин.

понедельник, 6 января 2020 г.

В Sublime Text 3 не работает emmet

#html #sublime_text_3 #emmet


Структура html не появляется после нажатия ! + tab. Также не работает ul>li*5.
Переустановка не помогает.

https://github.com/sergeche/emmet-sublime/issues/478 данные инструкции тоже не помогли
решить проблему. 
    


Ответы

Ответ 1



у меня тоже ни с того, ни с сего перестало работать развертывание. помог совет Прогера, ревключить синтаксис HTML На верхней панели инструментов ST ищем View, потом Syntax -> HTML, кликаем и проверяем. и переназначать ничего не надо было

Ответ 2



Preferences -> Settings. Проверьте что в ignored_packages нет Emmet и других плагинов

Ответ 3



Помогла переустановка emmet-а с последующим перезапуском Sublime Text

Ответ 4



мне помогло удаление плагина colorPicker

Ответ 5



У меня перестал работать плагин emmet. Нажатие кнопки TAB после знака ! = отступ, ul>li*5 = отступ. При этом в CSS все работает норм. Проблему решил так: Package Settings > Emmet > Key bindings - user строки 125, 126 - заменил "tab" на "alt+x" { "keys": ["alt+x"], "command": "insert_best_completion", "args": {"default": "\t", "exact": true} }, { "keys": ["alt+x"], "command": "insert_best_completion", "args": {"default": "\t", "exact": false},

Ответ 6



Помогло переназначение хоткеев tab в emmet > KeyBindings > User.

Ответ 7



У меня не работал Emmet, много что перепробовал, ничего не помогало. Вот что я сделал чтобы проблема ушла! Сначала создаем новый документ Сtrl+N, затем Ctrl+S сохраняем указывая имя файла Index.html (важность играет именно приписка .html, а не само название), после чего сохраняем. Вуаля.

Ответ 8



В настройках надо отключить включить HTML-синтаксис и будет вам счастье

Ответ 9



Нужно поменять синтаксис: View --> Syntax --> HTML

Ответ 10



Помог этот способ: Сначала создаем новый документ Сtrl+N, затем Ctrl+S сохраняем указывая имя файла Index.html (важность играет именно приписка .html, а не само название), после чего сохраняем.

Ответ 11



Зайди в Preferences > Packagec Sittings Там удали Emmet и установи обратно. мне помогло

Ответ 12



Если ничего из вышеуказанного не помогает, просто снимите галочку с view > word wrap

вторник, 31 декабря 2019 г.

Тонкая настройка LiveReload под sublime Text3

#sublime_text #sublime_text_3


Нужно, чтобы LiveReload отслеживал определенные типы файлов, а не все.
Сейчас в настройках пользователя такой код:

{
  "enabled_plugins": [
      "SimpleReloadPlugin",
      "SimpleRefresh"
  ]
}

    


Ответы

Ответ 1



Одним из решений может быть выкинуть сервер LiveReload, который поддерживает пакет для Sublime Text. Это не единственная реализация LiveReload-сервера. Есть также guard-livereload: плагин для системы Guard для выполнения действий при изменении файлов. Он написан на Ruby и потому для работы требует установленного Ruby. Порядок установки минимально отличается от других плагинов для Guard, вроде guard-haml, об установке и запуске которого я уже писал ранее. В Guardfile можно задать шаблоны путей, изменение файлов по которым даст сигнал клиенту LiveReload для обновления. В README есть пример: guard 'livereload' do watch(%r{app/views/.+\.(erb|haml|slim)}) watch(%r{app/helpers/.+\.rb}) watch(%r{public/.+\.(css|js|html)}) watch(%r{config/locales/.+\.yml}) end Код выше, разумеется, на Ruby. Каждая строчка watch добавляет на отслеживание пути, подходящие под регулярное выражение, относительно корня проекта (рабочей директории, где запущен guard). Регулярка записывается /так/, %r{так}, или другими способами. Само выражение можно проверить на Rubular или просто в Interactive Ruby (IRB). Guard можно загрузить и другими задачами, связанными с реакцией на изменение файлов. См. список плагинов Guard.

Ответ 2



Так как у "LiveReload" нет такой опции, которая могла бы решить мою проблему, я обратился за помощью к другим инструментам. Конкретно "Browsersync". Считаю хорошей альтернативой. Исполняет самую главную функцию "LiveReload", но дополняет её многими полезными инструментами и позволяет действительно тонкую настройку. А самое главное преимущество перед тем же "LiveReload" - это возможность синхронизации на разных устройствах в одной сети (ноут, смартфон, ПК и тд.). Так что хоть ответ выше напрямую связан с темой моего вопроса - я решил свою проблему другим методом, который решил не саму суть вопроса, но поставленную задачу - тонкая настройка при автообновлении! Удалил плагин LiveReload; Установил Node.js; Поставил Browsersync (npm install -g browser-sync);

Ответ 3



Еще есть браузер для вебдевелоперов Blisk на основе Chromium, умеет мониторить директории на изменения в файлах.

Скрытие ответов в тестах

#регулярные_выражения #sublime_text #sublime_text_3 #pcre


Здравствуйте, имеются готовые текстовые документы с тестовыми заданиями. Их содержимое:

Тема 1: Стихийные бедствия.
Автор: Булат Фаттахов
10. Таким женским именем звали ураган, сильно повредивший Новый Орлеан.
Ответ: Катрина.
20. "Дождь лил четыре года, одиннадцать месяцев и два дня" именно там.
Ответ: в Макондо.
30. В 1883 году было извержение вулкана именно на этом острове.
Ответ: Кракатау (Остров назывался так же как и вулкан).
40. Армянские города Гюмри и Ванадзор, сильно пострадавшие во время землетрясения
1988 года, в советское время носили такие названия.
Ответ: Ленинакан и Кировокан.
50. Крупнейшее за всю историю человечества это стихийное бедствие произошло в 1875
году в США, а не в Египте двумя тысячами годами ранее.
Ответ: Нашествие саранчи.

Тема 2: Города России.
Автор: Булат Фаттахов
10. Это крупнейший город России после Москвы.
Ответ: Санкт-Петербург.
20. Москва крупнейший город России, а Тольятти тоже крупнейший город в России среди
таких.
Ответ: Не являющийся столицей региона.
30. Это - крупнейший город самого большого острова России.
Ответ: Южно-Сахалинск.
40. Именно в этом городе происходит действие сериала "Счастливы вместе".
Ответ: Екатеринбург.
50. А именно этот город является самым западным городом России.
Ответ: Балтийск.


И так на протяжении всех файлов. я не хочу сразу видеть то, что содержится после
«Ответ». Нужно, чтобы ответы изначально были скрыты, становясь видимыми только тогда,
когда пользователь выполняет какое-то действие, например, нажимает на «Развернуть ответ».

Методы не имеют значения. Да, можно заключить ответы под спойлеры — в HTML, например,
проще всего в тэг  — Ответ:
Текст ответа
(что он не поддерживается IE и Firefox, ничего страшного) . Но как выполнить множественные замены (учитывая, что ответы могут быть в несколько строк), например, при помощи программы Sublime Text, поддерживающей регулярные выражения PCRE? Ответ: 'Текст ответа' 20. → Ответ:
'Текст ответа'
20. Ответ: 'Текст ответа' Тема → Ответ:
'Текст ответа'
Тема Спасибо.


Ответы

Ответ 1



Если в конце ответа обязательно цифра следующего вопроса или пустая строка, за которые можно зацепиться, то в Sublime можно так: Find What: ^Ответ: ((.|\n)+?)\n([0-9\n]) Replace With: Ответ:
\1
\n\3 (где \1 и \3 означают содержимое первой и третьей пар скобок в регулярке) (Немного пояснений: (.|\n)+ — берём один или больше любых символов, даже перенос строки, а +? — включаем ленивый режим работы вместо жадного, чтобы регулярка не считала одним ответом всё с начала первого ответа до конца последнего)

Ответ 2



В Notepad++ замена регулярные выражения с отмеченным флажком И новые строки. Исходный текст Тема 1: Стихийные бедствия. Автор: Булат Фаттахов 10. Таким женским именем звали ураган, сильно повредивший Новый Орлеан. Ответ: Катрина. 20. "Дождь лил четыре года, одиннадцать месяцев и два дня" именно там. Ответ: в Макондо. 30. В 1883 году было извержение вулкана именно на этом острове. Ответ: Кракатау (Остров назывался так же как и вулкан). 40. Армянские города Гюмри и Ванадзор, сильно пострадавшие во время землетрясения 1988 года, в советское время носили такие названия. Ответ: Ленинакан и Кировокан. 50. Крупнейшее за всю историю человечества это стихийное бедствие произошло в 1875 году в США, а не в Египте двумя тысячами годами ранее. Ответ: Нашествие саранчи. Тема 2: Города России. Автор: Булат Фаттахов 10. Это крупнейший город России после Москвы. Ответ: Санкт-Петербург. 20. Москва крупнейший город России, а Тольятти тоже крупнейший город в России среди таких. Ответ: Не являющийся столицей региона. 30. Это - крупнейший город самого большого острова России. Ответ: Южно-Сахалинск. 40. Именно в этом городе происходит действие сериала "Счастливы вместе". Ответ: Екатеринбург. 50. А именно этот город является самым западным городом России. Ответ: Балтийск. Замена 1: ((\d+)\. ((?!\r\nОтвет:).)+) Результат: Тема 1: Стихийные бедствия. Автор: Булат Фаттахов Ответ: Катрина. Ответ: в Макондо. Ответ: Кракатау (Остров назывался так же как и вулкан). Ответ: Ленинакан и Кировокан. Ответ: Нашествие саранчи. Тема 2: Города России. Автор: Булат Фаттахов Ответ: Санкт-Петербург. Ответ: Не являющийся столицей региона. Ответ: Южно-Сахалинск. Ответ: Екатеринбург. Ответ: Балтийск. Замена 2: (\r\n)(Ответ: ((?!\r\n(Тема:|\2
Результат: Тема 1: Стихийные бедствия. Автор: Булат Фаттахов
Ответ: Катрина.
Ответ: в Макондо.
Ответ: Кракатау (Остров назывался так же как и вулкан).
Ответ: Ленинакан и Кировокан.
Ответ: Нашествие саранчи. Тема 2: Города России. Автор: Булат Фаттахов
Ответ: Санкт-Петербург.
Ответ: Не являющийся столицей региона.
Ответ: Южно-Сахалинск.
Ответ: Екатеринбург.
Ответ: Балтийск.
Замена 3: (Тема (\d+).*?)(\r\n\1\3 Результат:

Тема 1: Стихийные бедствия. Автор: Булат Фаттахов

Ответ: Катрина.
Ответ: в Макондо.
Ответ: Кракатау (Остров назывался так же как и вулкан).
Ответ: Ленинакан и Кировокан.
Ответ: Нашествие саранчи.

Тема 2: Города России. Автор: Булат Фаттахов

Ответ: Санкт-Петербург.
Ответ: Не являющийся столицей региона.
Ответ: Южно-Сахалинск.
Ответ: Екатеринбург.
Ответ: Балтийск.
Замена 4: (id=sec-(\d+).*?)(id|for)(=chk)(\d+) \1\3\4-\2-\5 Нажимать Заменить все до тех пор, пока количество замен не станет равным нулю. Это будет в 2 раза больше нажатий, чем вопросов в самой большой теме. В принципе, можно уменьшить число нажатий вдвое. Результат:

Тема 1: Стихийные бедствия. Автор: Булат Фаттахов

Ответ: Катрина.
Ответ: в Макондо.
Ответ: Кракатау (Остров назывался так же как и вулкан).
Ответ: Ленинакан и Кировокан.
Ответ: Нашествие саранчи.

Тема 2: Города России. Автор: Булат Фаттахов

Ответ: Санкт-Петербург.
Ответ: Не являющийся столицей региона.
Ответ: Южно-Сахалинск.
Ответ: Екатеринбург.
Ответ: Балтийск.
Замена 5 (исправляем косяк, сделанный раньше) (\s*)() \2\1\3 Добавляем немного css: input { display: none; } input + label + div { display: none; } input:checked + label + div { display: block; } label { display: block; cursor: pointer; margin-top: 1em; } label:hover { color: blue; } label, div, h1 { white-space: pre-wrap; }

Тема 1: Стихийные бедствия. Автор: Булат Фаттахов

Ответ: Катрина.
Ответ: в Макондо.
Ответ: Кракатау (Остров назывался так же как и вулкан).
Ответ: Ленинакан и Кировокан.
Ответ: Нашествие саранчи.

Тема 2: Города России. Автор: Булат Фаттахов

Ответ: Санкт-Петербург.
Ответ: Не являющийся столицей региона.
Ответ: Южно-Сахалинск.
Ответ: Екатеринбург.
Ответ: Балтийск.


Ответ 3



Т. к. вопрос практический, позволю себе дополнить ответ ув-мого andreymal. Сначала желательно заменить слово или фразу, при нажатии на которое выводится спойлер, — например, в Chrome это «Подробнее», — при помощи тега . Если хотим кликать сразу на «Ответ», замена выйдет следующей: Find What: ^Ответ: ((.|\n)+?)\n([0-9\n]) Replace With:
Ответ:\1
\n\3 Затем, чтобы тэги отображись в Firefox, Edge и Opera Mini, требуется подключить скрипт Details-Polyfill. Для Эксплорера, к сожалению, и этот метод не работает, проверял на IE NetRenderer. Принцип действия скрипта: если браузер поддерживает
и , то ничего не происходит; не поддерживает — задействуется. Когда спойлеров множество, то, увы, достаточно продолжительное время, почему от просмотра в Firefox лучше всё же воздержаться. Итог см. в коде. /* Licensed under the MIT license: http://www.opensource.org/licenses/mit-license.php */ (function (doc) { 'use strict'; var i, j, textWrapper, idCount = 0, rootNode = doc.documentElement, headElem = doc.getElementsByTagName('head')[0] || rootNode, bodyElem = doc.getElementsByTagName('body')[0] || rootNode, detailStyleTag = doc.createElement('style'), rules = 'details { display: block; overflow:hidden; } \n' + 'details[open] { height: auto; } \n' + 'summary { display:inline-block; } \n' + 'details * { visibility: hidden; } \n' + 'summary:first-child { visibility: visible; cursor: pointer; } \n' + 'details[open] * { visibility: visible } \n' + 'details[open] summary { margin-bottom: 0; }', /* Technically, a summary element has a "Phrasing content" model and should be displayed inline. * see http://dev.w3.org/html5/spec/Overview.html#the-summary-element, * http://dev.w3.org/html5/spec/Overview.html#phrasing-content * * FYI: Chrome currently and incorrectly treats the element as block level. */ addRule = function (styleTag, rule) { if (styleTag.nodeName.toLowerCase() === 'style') { if (!!styleTag['styleSheet'] && styleTag.styleSheet['cssText'] !== undefined) { //for MSIE styleTag.styleSheet.cssText += '\n' + rule; } else { styleTag.appendChild(doc.createTextNode('\n' + rule)); } } }, addEvent = function (el, eventName, f) { //W3C event biding if (el.addEventListener) { el.addEventListener(eventName, f); //IE event binding } else if (el.attachEvent) { el.attachEvent('on' + eventName, f); // Fallback, but don't overwrite a preexisting "onclick" attribute. } else if (el['on' + eventName] === null) { el['on' + eventName] = f; } }, toggle = function (e) { /* When a element is clicked the parent
element's "open" * attribute needs to be toggled to maintain the attribute's reflective nature. * see http://dev.w3.org/html5/spec/Overview.html#attr-details-open */ var detailsElmnt, target = e.target || e.srcElement; if (target.nodeName.toLowerCase() === 'summary') { detailsElmnt = target; while (detailsElmnt.nodeName.toLowerCase() !== 'details') { detailsElmnt = detailsElmnt.parentNode; //Break if we get to the root node without finding a details element. if (detailsElmnt === bodyElem) { detailsElmnt = null; break; } } if (detailsElmnt) { if (detailsElmnt.getAttribute('open')) { detailsElmnt.removeAttribute('open'); } else { detailsElmnt.setAttribute('open', 'open'); } bodyElem.className = bodyElem.className; } } }, init = function () { var detailsID, detailsElem, summaryElem, height, //height of the summary element detailsElems = doc.getElementsByTagName('details'); for (i = 0; i < detailsElems.length; i++) { detailsElem = detailsElems[i]; if (!detailsElem.getAttribute('data-detailsid')) { detailsID = 'd' + (idCount++); detailsElem.className += (' ' + detailsID); detailsElem.setAttribute('data-detailsID', detailsID); /* The spec expects the functional element to be the first child node of a *
element. In practice, it appears the first child element of a * element is enlisted as the functional element and displayed as * though it were the first child. For our purposes, we will do that explicitly. * Additionaly, If a element does not exist, a default toggle is provided. */ summaryElem = detailsElem.getElementsByTagName('summary')[0]; if (!summaryElem) { summaryElem = doc.createElement('summary'); summaryElem.appendChild(doc.createTextNode('Details')); detailsElem.insertBefore(summaryElem, detailsElem.firstChild); } else if ( summaryElem !== detailsElem.firstChild) { detailsElem.removeChild(summaryElem); detailsElem.insertBefore(summaryElem, detailsElem.firstChild); } height = summaryElem.offsetHeight; addRule(detailStyleTag, 'details.' + detailsID + ' { height: ' + height + 'px; }\n' + 'details.' + detailsID + '[open] { height: auto; }'); //Text nodes are killing me here. Thanks to @Remy for the solve. // Weighing the pros and cons of using a standard element like or vs a non-standard // but more semantically meaninfull element, I think wins, though not without some // regret. for (j = 0; j < detailsElem.childNodes.length; j++ ) { if (detailsElem.childNodes[j].nodeName === '#text' && (detailsElem.childNodes[j].nodeValue||'').replace(/\s/g, '').length) { textWrapper = document.createElement('text'); textWrapper.appendChild(detailsElem.childNodes[j]); detailsElem.insertBefore(textWrapper, detailsElem.childNodes[j]); } } } } }; /* * The inserted stylesheet needs to be first so as to have a minimal cascading coeffecient. * It also needs to be added to the DOM before IE can access it's properties. * The polyfill only adds default or necessary styling and should not interfere with other style rules. */ headElem.insertBefore(detailStyleTag, headElem.firstChild); init(); addRule(detailStyleTag, rules); addEvent(bodyElem, 'click', toggle); addEvent(bodyElem, 'DOMSubtreeModified', init); }(document, undefined)); details Тема 1: Стихийные бедствия. Автор: Булат Фаттахов 10. Таким женским именем звали ураган, сильно повредивший Новый Орлеан.
Ответ:Катрина.
20. "Дождь лил четыре года, одиннадцать месяцев и два дня" именно там.
Ответ:в Макондо.
30. В 1883 году было извержение вулкана именно на этом острове.
Ответ:Кракатау (Остров назывался так же как и вулкан).
40. Армянские города Гюмри и Ванадзор, сильно пострадавшие во время землетрясения 1988 года, в советское время носили такие названия.
Ответ:Ленинакан и Кировокан.
50. Крупнейшее за всю историю человечества это стихийное бедствие произошло в 1875 году в США, а не в Египте двумя тысячами годами ранее.
Ответ:Нашествие саранчи.
Тема 2: Города России. Автор: Булат Фаттахов 10. Это крупнейший город России после Москвы.
Ответ:Санкт-Петербург.
20. Москва крупнейший город России, а Тольятти тоже крупнейший город в России среди таких.
Ответ:Не являющийся столицей региона.
30. Это - крупнейший город самого большого острова России.
Ответ:Южно-Сахалинск.
40. Именно в этом городе происходит действие сериала "Счастливы вместе".
Ответ:Екатеринбург.
50. А именно этот город является самым западным городом России.
Ответ:Балтийск.
UPD: начиная с 47-й версии Firefox поддерживает теги и
. Чтобы увидеть в Firefox действие тегов, пользователю необходимо ввести в адресную строку этого браузера about:config → Я обещаю, что буду осторожен → в строке поиска найти параметр dom.details_element.enabled → установить ему значение true.

среда, 25 декабря 2019 г.

Смена визуальных характеристик элементов готового синтаксиса в Sublime Text 3

#sublime_text #sublime_text_3


Не подсвечиваются/выделяются фоном нужные мне элементы кода. 



Сколько цветовых схем не перепробовал — ничего не помогает. Как написать простейший
собственный синтаксис, расписано здесь, но что нужно проделать для изменения уже готовых?
    


Ответы

Ответ 1



Если не устраивает ни одна готовая схема, задаём цвета самостоятельно. Стоит предупредить о трёх обстоятельствах: С момента внесения правки в цветовую схему до отображения нового цвета может пройти несколько минут. Иногда помогает перезагрузка файла или самого Sublime Text 3. Из stack trace и всплывающих окон редактора не всегда понятно, где совершил опечатку в синтаксисе. Рекомендую пользоваться плагином Local History, чтобы оставалась возможность откатиться до предыдущих версий файла. Scopes (см. ниже) меняются с выходом новых билдов Sublime Text 3. После обновления может оказаться, что прописанные вами настройки сбились, и придётся заново вставлять уже новые области видимости. Свойства, отвечающие за цвет и начертание элементов синтаксиса языков разметки, программирования, наборов макропакетов, языков и таблиц стилей и т. д. в Sublime Text 3 называются «scopes». Перевёл как «области видимости», за точность перевода не ручаюсь. Куда что вставлять Открываем файл своей активной цветовой темы (схемы). Если не знаете, как, см. здесь в первых двух абзацах после «Простое решение». Куда-нибудь между тегами нашей цветовой схемы вносим следующий XML-массив: name Scope Name scope scope(s) settings foreground color Параметры: — необязательный. Дабы не забыть, что означает вставленная нами область видимости. name, Scope Name — необязательный. Между тегами задаём любое имя области видимости, которое будет отображаться в TmTheme Editor. scope, scope(s) — между тегами вставляем область (или области) видимости. Как их получить — см. ниже по тексту. Важно не оставлять пространство между пустым, — иначе цветом, что указан у вас вместо color, подсветится и совсем не то, что вы хотели. foreground, color — между тегами указываем цвет в форматах HEX, ARGB или X11. Последний формат не рекомендовал бы ввиду того, что а) как минимум цвета aqua, fuchsia и lime не всегда поддерживаются Sublime Text 3, б) периодически возникают разного рода неисправности, не случающиеся, если вводим цвет в HEX или ARGB. Получаем и вносим область видимости одним из трёх способов, подробно расписанных ниже, вслед за примерами. Вписываем в XML-конструкцию цвет вместо color → сохраняем файл цветовой схемы → смотрим результаты. Примеры Золотой текст: scope text.html.basic source.js.embedded.html source.js meta.group.braces.round meta.group.braces.curly meta.property.object.js settings foreground gold Зелёный фон: scope text.html.basic source.js.embedded.html source.js meta.group.braces.round meta.group.braces.curly meta.function-call.method.without-arguments.js variable.function.js settings background #6BC7548F Наклонный коралловый текст: scope text.html.basic source.js.embedded.html source.js meta.group.braces.round meta.group.braces.curly meta.function-call.method.with-arguments.js variable.function.js settings fontStyle italic foreground lightcoral Ключи foreground, fontStyle (принимает значения bold или italic, значения указывать со строчной буквы) и background можно комбинировать между собой, т. е. допускается одновременное задание цвета элемента, его начертания и цвета фона вокруг: fontStyle italic foreground lightcoral Несколько областей видимости, которые будут иметь одинаковый цвет, вносятся через запятую. Допустим, мы желаем идентичную раскраску у открывающих и закрывающих скобок тега : name Tag script brackets, open and closed scope text.html.basic source.js.embedded.html punctuation.definition.tag.begin.html, text.html.basic source.js.embedded.html punctuation.definition.tag.end.html settings foreground yellow Результат, после того, как мы задали цвета областям видимости всем элементам примера. Было: Стало: Получение областей видимости: Узнать активную, т. е. до или в пределах которой находится каретка, область видимости элемента можно сочетанием клавиш Ctrl + Alt + Shift+ P. Scope отобразится в строке состояния (Status Bar) нижней части окна Sublime Text 3. Однако из строки состояния не скопировать необходимую область видимости, необходимо воспользоваться одним из трёх способов ниже. Плагины от adzenith и ttscoff, также предназначенные для получения scopes в буфер обмена, у меня не заработали, — по всей видимости, они для Sublime Text 2, но не Sublime Text 3. UPD: Начиная с билда 3114 области видимости отображаются уже в отдельном окне, а не строке состояния, и их можно копировать. Плагин от r-stein, о котором идёт речь ниже, уже не особо и нужен. 1. Плагин от r-stein Проделаем следующие операции: а. Копируем в буфер обмена следующий код: sublime.set_clipboard(view.scope_name(view.sel()[0].b)) б. Устанавливаем каретку (упрощённо говоря, кликаем левой кнопкой мыши) до или внутри — но не после — элемента синтаксиса, цвет которого хотим изменить. в. Ctrl + ` (машинописный обратный апостроф, символ расположен на той же клавише, где кириллическая «ё») → вставляем в открывшееся поле ввода код, что мы скопировали на 1-м этапе, → Enter → в нашем буфере обмена содержится необходимая область видимости. Как можно убедиться на практике, это не очень удобно. Для упрощения выполнения операции служит плагин от ув-мого r-stein. Tools → New plugin... → Вставляем в открывшийся файл код на Python: import sublime, sublime_plugin class CopyScopeCommand(sublime_plugin.TextCommand): def run(self, edit): view = self.view sublime.set_clipboard(view.scope_name(view.sel()[0].b)) sublime.status_message("Scope copied") Ctrl + S → сохраняем файл как copy_scope.py. Задаём плагину шорткат: Preferences → Paskage Settings → Mediawiker → Key Bindings - User → между [] вписываем в открывшийся файл: // Копирование областей видимости { "keys": ["ctrl+7", "ctrl+o"], "command": "copy_scope" }, Сохраняем. Чтобы сочетание наверняка оказалось ничем не занятым, я выбираю двухэтапные хоткеи — то есть ввожу Ctrl + 7, затем Ctrl + O, и только после двух нажатий выполняется необходимая команда. Можете назначить одноэтапный, только лучше удостоверьтесь, что шорткат свободен: Preferences → Key Bindings - Default → в открывшемся файле Ctrl+F → временно отключаем кнопку Regular expression, иначе не удастся найти символ +, → вводим в форму поиска сочетание клавиш, которое хотим использовать, → если оно задействовано, выбираем другое, которое, впрочем, также может быть занято каким-то из установленных вами плагинов. (опционально) Добавляем кнопку вызова плагина в контекстное меню, появляющееся при нажатии правой кнопкой мыши в любую область ввода текста: Preferences → Browse Packages... → User → создаём файл Context.sublime-menu, если его нет, → вставляем в файл [ { "command": "copy_scope" }, ] Сохраняем. Если же файл существует, и в нём прописана команда для другого плагина, разделяем объекты запятыми после {фигурных скобок}. Объекты заключены в [квадратные скобки] (JSON-синтаксис). [ { "command": "lat_to_cyr" }, { "command": "copy_scope" }, ] То же замечание по поводу запятых и скобок касается предыдущего и последующего примеров. (опционально) Добавляем кнопку вызова плагина в верхнее меню: Preferences → Browse Packages... → User → создаём файл Main.sublime-menu, если его нет, → вписываем: [ { "id": "edit", "children": [ { "command": "copy_scope" } ] }, ] Сохраняем. Наводим каретку до или внутри элемента, область видимости которого следует узнать, → вызываем команду получения scope любым из методов — Ctrl + 7, затем Ctrl + O; клик правой кнопкой мыши в любую область ввода текста → Copy Scope; Edit → Copy Scope — область видимости находится в нашем буфере обмена. 2. ScopeHunter онлайн Сервис поддерживает только синтаксисы, перечисленные на картинке ниже, тогда как методами 1 и 3 изменяется раскраска у любых элементов всех синтаксисов Sublime Text 3. Например, я написал цветовую схему с поддержкой вики-разметки, для меня вариант со ScopeHunter онлайн частично не подошёл. Переходим на сайт TmTheme Editor → Gallery, если пользуетесь готовой цветовой схемой, Open — собственной (когда файл темы находится среди файлов вашего компьютера, открываете его, как описано здесь, и в title окна Sublime Text 3 высветится путь к локальному файлу) → в правом нижнем углу выбираем необходимый язык разметки/программирования → Customize Preview Code → вставляем тот самый код, где элементы подсвечиваются не так, как вам нужно → Save → Scope Hunter → наводим мышью на элементы → под строкой Current Scope выводится искомая область видимости: Если у выбранной области видимости задан параметр «Name» (под «Matching Rule»), то слева находим Score Name c таким же значением параметра, как у «Name», → меняем цвета в веб-панели. Доступен онлайн-предпросмотр. Когда же напротив Name ничего не указано, придётся создавать XML-массив (см. Куда что вставлять) и вписывать область видимости в него. Save → Download → сохраняем файл туда же, откуда его взяли. К сожалению, работа над сервисом фактически прекращена, результат будет отличаться от того, что вы имеете в Sublime Text 3, иногда разительно. Скриншоты одного скрипта, сделанные 13 июня 2016 в Sublime Text 3 и TmTheme Editor: 3. Плагин ScopeHunter Поддерживаются любые синтаксисы. Устанавливаем плагин через Package Control → Ctrl + Shift + P → в появившееся поле ввода вписываем одну из двух команд: Scope Hunter: Toggle Instant Scoper — (зная о fuzzy поиске, можно ввести shtis) решение, когда необходимо изменить цвета множеству элементов. Внизу появится консоль, где отобразятся области видимости, автоматически сменяющиеся в зависимости от того, до или внутри какого элемента синтаксиса располагается каретка. Чтобы scopes добавлялись в буфер обмена автоматически, задайте значение true параметру clipboard: Preferences → Package Settings → ScopeHunter → Settings - User → вставляем следующий код и сохраняем файл. { "clipboard": true, } Когда вы не собираетесь работать с областями видимости, чтобы они не мешались в буфере обмена, установите значение false или же прекратите действие команды ScopeHunter перезагрузкой Sublime Text 3. Впрочем, иногда она сама по непонятным причинам прекращает функционировать, и приходится заново после Ctrl+Shift+P вводить shtis. Scope Hunter: Show Scope Under Cursor — подходит, когда требуется преобразить колор одному или нескольким элементам. После того, как вы закрываете консоль клавишей Esc, чтобы узнать области видимости ещё раз, придётся вновь набирать данную команду. Если в течение сеанса работы в Sublime Text 3 вы ввели одну из этих команд, то другая не заработает до того, как вы перезагрузите Sublime Text 3. Поддерживаются множественные курсоры. Зажмите клавишу Ctrl и кликайте мышью до или внутри элементов, область видимости которых необходимо узнать. В нижней консоли появятся scopes сразу всех их. Пример: Scope: text.html.basic source.js.embedded.html source.js meta.group.braces.round meta.brace.round.js ------ Scope: text.html.basic source.js.embedded.html source.js meta.group.braces.round meta.group.braces.curly variable.other.readwrite.js ------ Scope: text.html.basic source.js.embedded.html source.js meta.group.braces.round meta.group.braces.curly support.type.object.dom.js ------ Копируем области видимости (то, что справа, без Scope: с чёрточками). Резюме по рассмотренным способам получения областей видимости: Плагин от r-stein: Плюс — наиболее быстрое получение scopes, Минус — нет никаких дополнительных функций. ScopeHunter онлайн: Плюс — быстрый предпросмотр цветов онлайн, Минусы — неактивный разработчик и как следствие отсутствие поддержки новых изменений; ограниченная поддержка синтаксисов. Плагин ScopeHunter: Плюс — работа сразу с множеством областей видимости, Минус — перебои в работе плагина. Когда мне требуется изменить 1—2 области видимости, я пользуюсь плагином от r-stein; нужен быстрый предпросмотр — захожу в TmThemeEditor; ну а если основательно сажусь править цветовых темы, то привожу в действие плагин ScopeHunter.

среда, 11 декабря 2019 г.

Как выделить текст между парными “кавычками” в Sublime Text 3?

#sublime_text #sublime_text_3


Как выделить текст между двумя парными "кавычками" в Sublime Text 3?

Есть горячие клавиши, но там присутствует только метод выделения текста между скобками
(brackets) или парными тегами. 

Изменение стандартной комбинации на свою не помогает:



{ "keys": ["ctrl+shift+m"], "command": "expand_selection", "args": {"to": "brackets"} }



    


Ответы

Ответ 1



Попробуйте комбинацию Ctrl+Shift+Space - для некоторых форматов файлов она выделяет текст как раз внутри "кавычек". Точно работает в .scss, .html, а также в .slim для значений атрибутов тегов.

Ответ 2



0. Не рекомендуется 1. Expand Selection to Scope Встроенное в Sublime Text средство выделения, упомянутое в ответе ув-мого Виталия Емельянцева. 1. Демонстрация Во всех примерах выделяется текст не только между кавычек, но и сами кавычки. 2. Ожидаемое поведение мне не удалось найти документации по команде expand_selection с аргументом {"to": "scope"}, но, исходя из названия и некоторых характеристик поведения, должен выделяться весь текст рядом с кареткой, имеющий ту же scope, что и символ перед кареткой. Scope в Sublime Text могут быть достаточно длинными, например: text.html.basic source.js.embedded.html meta.delimiter.comma.js, text.html.basic source.js.embedded.html meta.function.declaration.js punctuation.separator.parameter.function.js. Expand Selection To Scope должно выделить сначала text.html.basic source.js.embedded.html meta.delimiter.comma.js, text.html.basic source.js.embedded.html meta.function.declaration.js punctuation.separator.parameter.function.js, затем, если рядом есть такая область видимости, — text.html.basic source.js.embedded.html meta.delimiter.comma.js, text.html.basic source.js.embedded.html meta.function.declaration.js, потом text.html.basic source.js.embedded.html meta.delimiter.comma.js, text.html.basic source.js.embedded.html и т. д. В первом примере на демо кавычки в синтаксисе для Suricate имеют ту же область видимости, что и текст меж ними; во втором — кавычки включены в комментарий, поэтому выделяется комментарий, а не текст между кавычками. Это ожидаемое поведение. Команда expand_selection с аргументом {"to": "scope"} и должна выделять текст по scopes, а не делимитерам. Кавычки в различных синтаксисах имеют собственные области видимости далеко не всегда, поэтому когда работаете с различными синтаксисами, лучше не пользоваться ей для выделения текста между кавычками. 3. Актуальное поведение Судя по последним двум выделениям на демо Expand Selection to Scope имеет баги, воспроизводящиеся на «чистом» Sublime Text без плагинов и пользовательских настроек. В третьем и четвёртом примерах по идее должен выделяться текст между кавычек. В третьем expand_selection {"to": "scope"} выделяет кавычки во встроенном в HTML скрипте, в четвёртом на синтаксисе пакета PackageDev вообще предлагает крайне нерелевантные выделения. 2. Keyboard Selection 1. Демонстрация 2. Описание Данный плагин позволяет выделять текст между различными типами кавычек, скобок и между различными делимитерами. Только, как видно из GIF, он выделяет текст между одинарной кавычкой — ' и двойной — "; между угловой скобкой — < и квадратной — ]. Плагин не сопоставляет типы кавычек и скобок. Также я не понимаю, зачем на практике может понадобиться выделение между различными делимитерами. Остальные команды плагина во многом идентичны дефолтным командам Sublime Text, в Windows запускающимися шорткатами Ctrl+Left/Right, Alt+Left/Right и Ctrl+Delete. В целом не вижу, зачем может пригодиться Keyboard Selection. 1. Плагины специально для выделения текста между кавычками В книге «Sublime Text Power User» упомянуты 2 плагина, отвечающие на данный вопрос: Select Quoted и Expand Selection To Quotes. 1. SelectQuoted При нажатии шортката — Ctrl+' по умолчанию в Windows — выделяется сначала текст между кавычек, затем вместе с кавычками, → но потом выделение останавливается. Вторая команда с аргументом "args": {"inside": false} — Ctrl+Shift+' по умолчанию в Windows — у меня не работает вообще. 2. Expand Selection To Quotes При нажатии шортката — Ctrl+' по умолчанию в Windows — выделяется сначала текст между кавычек, затем вместе с кавычками → потом между следующими кавычками и т. д. 2. Универсальные решения Текст между определёнными делимитерами выделяет и Bracketeer. Однако он не включён в данный обзор, поскольку из описаний автора плагина — ув-мого Colinta — по крайней мере лично мне проблематично понимать, для чего нужны его плагины и как они работают. Если хотите попробовать — упреждаю, что из приведённого в качестве примера кеймапа ничего не будет функционировать. 1. ExpandRegion 1. Демонстрация 2. Описание «Умное» выделение текста. Причём для любых видов выделений нужно нажимать всего один шорткат. Второй служит для возврата (undo) к предыдущему выделению (см. демо для Markdown). Поддерживаемые синтаксисы: HTML, Python, JavaScript, LaTeX. Чтобы произвести выделение именно между кавычками, обычно приходится нажимать на хоткей 2 или более раз. Если нужны выделения исключительно между "кавычками", обратите внимание на решение 1.1, а лучше 1.2. 3. Настройка горячих клавиш После установки плагина хоткеи придётся задавать самим. Пользователям Windows не рекомендую копировать горячие клавиши, приведённые в описании плагина. Они конфликтуют с глобальными шорткатами Windows, которые проблематично отключить, не получая багов. Если знаете, как отвязать отдельные горячие клавиши Windows, чтобы использовать их в Sublime Text, поделитесь решением с другими пользователями, ответив на соответствующий вопрос в Super User. Как пользоваться Suricate, и что означает код ниже, читаем здесь. В файл User/Default.suricate-profile добавляем следующие строки: // Expand Region "sasha_expand_region": { "caption": "Expand Region", "keys": ["super+y"], "call": "sublime.expand_region", }, // Expand Region Undo "sasha_expand_region_undo": { "caption": "Expand Region Undo", "keys": ["super+shift+y"], "call": "sublime.expand_region", "args": { "undo": true }, "context": [{ "key": "expand_region_soft_undo" }] }, context — параметр, означающий, что команда выполняется только в определённом контексте; в данном случае отмена выделения на предыдущее произведётся, если до того происходили выделения командой expand_region. Когда же мы ничего не выделяли хоткеем Super+Y, но нажали Super+Shift+Y, будет только напечатана буква y (если у Вас сочетанием Super+Shift+Y не настроен запуск других команд). 4. Настройка синтаксиса Выделение командой expand_region может не работать или функционировать плохо в отдельных синтаксисах. Например, у меня неважно выделялся текст для CSS во встроенном HTML и в Markdown-разметке. Чтобы исправить это, установите плагин Edit Preferences → Edit Preferences: Edit Settings... → ExpandRegion → scope_selectors → между фигурными скобками вставляем следующий код: "python": ["text.html.markdown.gfm"], "javascript": ["source.css"] text.html.markdown.gfm и source.css — области видимости синтаксиса, рассматриваемые в следующем подразделе. Пробуем выделять теперь. Если по-прежнему плохо, вместо параметра python подставляем javascript, html и latex; вместо javascript, соответственно python, html и latex. Останавливаемся на варианте, который выделяет лучше. 5. Получение области видимости синтаксиса Каждая область видимости начинается со scope selector, одинакового для всех scope синтаксиса. К примеру, для синтаксиса Ruby по умолчанию этот scope selector — source.rb, для C++ — source.c++. я не нашёл в документации или поиском в Google, чтобы первый scope selector имел конкретное точное название, назовём его «областью видимости синтаксиса» или «syntax scope». Чтобы получить syntax scope, нажмите Ctrl+' (машинописный обратный апостроф, символ расположен на той же клавише, где кириллическая «ё») → вводим в открывшееся поле код: view.scope_name(0).split()[0] Между 'одинарными кавычками' получаем syntax scope, которая много где может пригодиться. 6. Scope selectors для встроенных языков Но во втором случае лучше, если бы правила выделения ExpandRegion для JavaScript применялись только в инлайновом CSS, но не остальной части HTML-документа, поскольку парсер javascript из ExpandRegion позволяет ограничивать действие параметра javascript из п. 2.1.4 селекторами областей видимости — «scope selectors». "javascript": ["source.css"] означает, что если в HTML где-либо содержатся области видимости, содержащие в названии source.css, то ExpandRegion задействует параметр javascript, нет — ExpandRegion выделяет по умолчанию (при условии, что не заданы значения прочим параметрам). Области видимости инлайновых CSS и JavaScript содержат scope selector, являющийся «областью видимости синтаксиса», как если бы файл был бы открыт в синтаксисе встроенного языка. То есть: открываем css-файл и получаем syntax scope — source.css. Это source.css будет содержаться и в названиях областей видимости для инлайнового CSS, начинающихся на text.html.basic source.css.embedded.html. У JavaScript область видимости синтаксиса — source.js, scope инлайнового JavaScript начинаются на text.html.basic source.js.embedded.html. 3. Дополнительные ссылки О выделении различных участков текста/кода в неофициальной документации Sublime Text; Описание действия плагина ExpandRegion, основанного на расширении для Emacs, разработанном, в свою очередь, на основе Mathematica IDE; Принципы именования областей видимости в Sublime Text.

вторник, 10 декабря 2019 г.

Быстрая замена в тексте латинских символов на кириллические со сходным начертанием

#регулярные_выражения #sublime_text #sublime_text_3


Здравствуйте. Приходится иметь дело с русскими текстами, где присутствует нежелательное
вкрапление символов английского алфавита. 



Т. к. расположение вкраплений всегда разное и не подчинено каким-либо правилам, я
не могу осуществлять поиск слов в тексте.

Решение — заменить латинские буквы ABEKMHOPCTXaeopcyx на соответствующие им кириллические
АВЕКМНОРСТХаеорсух: A → А, B → В и т. д. Как в Sublime Text эффективнее всего произвести
все 18 замен?

Этот вопрос частный случай более общего: как произвести множество замен в одном регулярном
выражении? Спасибо.
    


Ответы

Ответ 1



Плагин для ST2, выполняющий желаемое: # -*- coding: utf-8 -*- import sublime, sublime_plugin class MultipleReplace(sublime_plugin.TextCommand): def run(self, edit): target = "ABEKMHOPCTXaeopcyx" # en replacer = u"абекмнорстхАЕОРСУХ" # ru region = sublime.Region(0, self.view.size()) fullText = unicode( self.view.substr( region ) ) count = 0 for ch in range( len(target) ): count += fullText.count( target[ch] ) fullText = fullText.replace( target[ch], replacer[ch] ) self.view.replace( edit, region, fullText ) sublime.status_message( "Hidden chars replaced: " + str( count ) ) Плагин для ST3, выполняющий желаемое: # -*- coding: utf-8 -*- import sublime, sublime_plugin class MultipleReplace(sublime_plugin.TextCommand): def run(self, edit): target = "ABEKMHOPCTXaeopcyx" # en replacer = u"абекмнорстхАЕОРСУХ" # ru region = sublime.Region(0, self.view.size()) fullText = self.view.substr( region ) count = 0 for ch in range( len(target) ): count += fullText.count( target[ch] ) fullText = fullText.replace( target[ch], replacer[ch] ) self.view.replace( edit, region, fullText ) sublime.status_message( "Hidden chars replaced: " + str( count ) ) Вечером распишу подробнее, как устанавливать плагины в ST. Здесь можно найти, как устанавливать плагин: https://habrahabr.ru/post/136529/

Ответ 2



Just for fun Все это можно сделать регулярным выражением в один проход, но рекомендую плагин все же. Плагин - это правильный путь решения задачи. Итак Добавляем в конец текста с новой строки "магическую" строку (в ней чередуются латинский символ и соответствующий киррилический) AАBВEЕKКMМHНOОPРCСTТXХaаeеoоpрcсyуxх Ищем по регулярному выражению (.)(?=[\s\S]*\n[^\n]*\1(.)(?:[^\n]{2})*\n?(?![\s\S])) с учетом регистра замену делаем на $2 удаляем "магическую" строку из текста Потрогать регулярку можно здесь: https://regex101.com/r/iW2yE3/1

Ответ 3



К сведению Нативный поиск Ctrl+F Sublime Text 3 позволяет вести множественный поиск. Синтаксис поисковых запросов: ($первая фраза|$вторая фраза). Однако сделать множественную замену одним запросом в нативном поиске не получится. Решение, расписанное в данном ответе, позволяет делать множественные замены только в одном файле, но не нескольких. Не скажу, что очень уж тщательно искал, но мне вообще не удалось найти любых программ (искал для своей ОС — Windows), при помощи которых можно было бы делать множественные замены во множестве файлов. Протестировано в ноябре 2016 на Sublime Text Build 3126. Упреждаю, поскольку, например, настройки, описанные в статье о RegReplace за июнь 2016 уже утратили актуальность. RegReplace Плагин, служащий для выполнения множественных замен в Sublime Text 3, документация. Позволяет заменять не только в простых случаях, как рассматриваемый в данном вопросе, но и с использованием регулярных выражений, для операций с которыми используется модуль Python re. Составление правил замены в RegReplace Preferences → Package Settings → RegReplace → Rules - User → в открывшийся файл вставляем код. { "replacements": { "sasha_felicity_A": { "find": "A", "replace": "А", }, "sasha_felicity_B": { "find": "B", "replace": "В", }, "sasha_felicity_E": { "find": "E", "replace": "Е", }, "sasha_felicity_K": { "find": "K", "replace": "К", }, "sasha_felicity_M": { "find": "M", "replace": "М", }, "sasha_felicity_H": { "find": "H", "replace": "Н", }, "sasha_felicity_O": { "find": "O", "replace": "О", }, "sasha_felicity_P": { "find": "P", "replace": "Р", }, "sasha_felicity_C": { "find": "C", "replace": "С", }, "sasha_felicity_T": { "find": "T", "replace": "Т", }, "sasha_felicity_a": { "find": "a", "replace": "а", }, "sasha_felicity_e": { "find": "e", "replace": "е", }, "sasha_felicity_o": { "find": "o", "replace": "о", }, "sasha_felicity_p": { "find": "p", "replace": "р", }, "sasha_felicity_c": { "find": "c", "replace": "с", }, "sasha_felicity_y": { "find": "y", "replace": "у", }, "sasha_felicity_x": { "find": "x", "replace": "х", }, } } Напротив find латинские символы, напротив replace — кириллические. Вместо sasha_felicity_$буква можете назвать правила любыми другими именами, лишь бы они не совпадали с названиями других правил. Если не указать флага IGNORECASE, то при выполнении операций поиска и замены будет учитываться регистр. Латинская H в тексте заменится на кириллическую Н, но латинская h не сменится кириллической н, что и нужно по условиям вопроса. Если учитывать регистр надо, синтаксис правила будет таким: "sasha_felicity_H": { "find": "(?i)H", "replace": "Н", }, Запуск команды с правилами RegReplace Для работы с командами в Sublime Text я использую фрэймворк Suricate. Он позволяет не создавать 100500 файлов sublimе-commands, sublime-keymap, Context.sublime-menu и Main.sublime-menu, а задать настройки для открытия команд из Command Palette, контекстного меню, Menu Bar и горячими клавишами в одном файле сразу для всех команд всех плагинов и настроек по умолчанию. Страница документации Suricate о командах, Как настроить запуск команд в Suricate. В файл User/Default.suricate-profile добавляем следующие строки: "sublime_latin_to_cyrillic": { "call": "sublime.reg_replace", "caption": "RegReplace: Latin To Cyrillic", "args": { "replacements": [ "sasha_felicity_A", "sasha_felicity_B", "sasha_felicity_E", "sasha_felicity_K", "sasha_felicity_M", "sasha_felicity_H", "sasha_felicity_O", "sasha_felicity_P", "sasha_felicity_C", "sasha_felicity_T", "sasha_felicity_a", "sasha_felicity_e", "sasha_felicity_o", "sasha_felicity_p", "sasha_felicity_c", "sasha_felicity_y", "sasha_felicity_x", ] } }, Параметры: sublime_latin_to_cyrillic — имя массива. Можете задать произвольное, лишь бы самим было понятно, что оно означает. call — название команды Sublime Text в формате sublime.$имя команды. caption — как будет называться пункт в Command Palette, нажав на который запустится команда, прописанная в call. Вместо RegReplace: Latin To Cyrillic Можете задать произвольное, лишь бы самим было понятно, что оно означает. args — аргументы команды reg_replace. В их качестве выступают правила, о которых шла речь в предыдущем разделе. я рекомендую использовать Suricate, но можете задать настройки и без установки дополнительных плагинов. Preferences → Package Settings → RegReplace → Commands - User → в открывшийся файл вставляем код: [ { "caption": "Reg Replace: Test RegReplace", "command": "reg_replace", "args": { "replacements": [ "sasha_felicity_A", "sasha_felicity_B", "sasha_felicity_E", "sasha_felicity_K", "sasha_felicity_M", "sasha_felicity_H", "sasha_felicity_O", "sasha_felicity_P", "sasha_felicity_C", "sasha_felicity_T", "sasha_felicity_a", "sasha_felicity_e", "sasha_felicity_o", "sasha_felicity_p", "sasha_felicity_c", "sasha_felicity_y", "sasha_felicity_x", ] } } ] Что означают параметры, понятно из предыдущего раздела. Не путайтесь в JSON-синтаксисе конфигурационных файлов, правильно расставляйте скобки, кавычки и запятые. Использование После того, как произвели все настройки, открываем файл, в котором необходимо произвести замену, → Ctrl+Shift+P → Suricate: RegReplace: Latin To Cyrillic → Enter → должно получиться так:

понедельник, 9 декабря 2019 г.

Как пакетно конвертировать пробелы в отступы в Sublime Text 3

#регулярные_выражения #sublime_text_3


Как без ущерба проекту пакетно заменить пробелы на табы? Я имею ввиду, чтобы не открывать
каждый файл, если файлов больше тысячи, — замучаться можно, — а сделать это массово.

UPD. Саша, спасибо большое за ссылки, думаю, одна из них приблизила меня к цели.
:) Только когда я вписываю в поиск Find: {4}, ST3 пишет, что ничего не найдено. К сожалению,
Windows у меня действительно нет под рукой. Ещё не совсем понимаю смысл вот этой фразы: 


  As mentioned in comments to match spaces at the start of a line you
  can use the regexp ^( {4})+


UPD. 2 Большое Вам спасибо! Действительно, всё получилось, вот только проблема в
том, что ST3 открыл все файлы, и каждый приходится сохранять. Можно ли как-то сделать,
чтобы он сам всё сохранил и закрыл? Или, может, существует другое, альтернативное решение?
    


Ответы

Ответ 1



В основном меню: View - Indentaion На оффсайте можно почитать подробности: Indentation Settings

Ответ 2



В unix-подобных системах существует утилита unexpand. Для обработки группы файлов можно написать простенький скрипт на bash: find . -name '*.[ch]' -exec sh -c 'unexpand {} > tmp.~ && mv tmp.~ {}' \; expand делает обратную замену.

Ответ 3



Ctrl + Shift + F: Напротив Find: вставляем регулярное выражение ^ {4}, где 4 — количество пробелов, которые мы заменяем отступом. По умолчанию — 4, если прежде не меняли никаких настроек индентации, оставляйте ^ {4}. Регулярные выражения должны быть включены самой левой кнопкой консоли «Find in files» (той, которую мы вызвали шорткатом Ctrl + Shift + F). Напротив Where: нажимаем на кнопку ... → Add Folder → выбираем папку проекта. Если проект очень большой на тысячи файлов, рекомендовал бы производить замену по частям, ибо при работе с огромными массивами Sublime Text 3 имеет свойство подвисать. Напротив Replace: вставляем \t — метасимвол табуляции. Получается так: Жмём на Replace → файлы, в которых произведена замена, откроются в новых вкладках, → в верхнем меню кликаем File → Save All. Замена произведена. File → Close All Files — все вкладки закроются. Для тех, кто пакетно работает с множеством файлов, не покажется лишним плагин TabExtra, добавляющий новые возможности при работе с вкладками. Положим, в нашем примере мы сделали массовую замену, но где-то опечатались в синтаксисе регулярных выражений, из-за чего получилось не то, что требовалось. Кликаем правой кнопкой мыши по любой вкладке → Close Tab(s): Dismiss Unsaved → Close All Tabs → все вкладки закроются без сохранения. На английском Stack Overflow рекомендуют использовать шаблон ^( {4})+. Однако если Ваш код отформатирован каким-нибудь Beautifier'ом, то оформление может испортиться, и придётся форматировать заново. Пример применения моего регулярного выражения: Пример применения регулярного выражения, рекомендованного на англоязычном Stack Overflow: Разберём модель ^( {4})+: ^ — метасимвол начала строки. Если его не использовать, в отступы отконвертируются пробелы, стоящие не только в начале строки, но и в любом другом месте текста. ( {4}) — пробел, повторённый 4 раза. Эквивалентно ( ). + — квантор, означающий повторение выражения в скобках 1 или более раз. Другими словами 4, 8, 12 и другие кратные четырём количества пробелов подряд заменятся на один отступ. Код может выстроиться в один столбец как на примере. Если не желаете терять оформление, используйте регулярное выражение ^ {4}. Чтобы проблемы с табами/пробелами в дальнейшем не беспокоили, в какой бы операционной системе и IDE/редакторе ни работали разработчики проекта, сейчас повсеместно для каждого мало-мальски используемого редактора или IDE применяется плагин EditorConfig. После установки через PackageControl в папке проекта создаём файл .editorconfig, куда вставляем следующий текст: # editorconfig.org root = true [*] indent_style = tab indent_size = 4 end_of_line = lf charset = utf-8 trim_trailing_whitespace = true insert_final_newline = true [*.md] trim_trailing_whitespace = false У всех файлов проекта будет автоматически настраиваться Tab_Size:4, пусть вы поставили или редактор определил («умное» автоопределение можно отключить в открывающийся после Preferences → Settings - User файл, добавив в него строку "detect indentation": false, однако Sublime Text 3 всё равно порой устанавливает индентацию по-своему) иначе. Представлены значения по умолчанию, можете менять их по своему усмотрению, подробности в статье на Хабрахабре. Поддерживаемые настройки для Sublime Text.