I have this .clang-format file in root of project:
# A clang-format style that approximates Python's PEP 7
BasedOnStyle: Google
AlwaysBreakAfterReturnType: None
# Пытается выровнять операнды друг под другом после переноса
# AlignAfterOpenBracket: Align
# Разрешает переносить элементы вложенных списков инициализации,
# если они превышают ColumnLimit
AlignAfterOpenBracket: BlockIndent
ColumnLimit: 120
DerivePointerAlignment: false
IndentWidth: 4
# чтобы убрать специфический "гугловский" отступ в 2 пробела
AccessModifierOffset: -4
Language: Cpp
PointerAlignment: Right
ReflowComments: true
SpacesInParentheses: false
TabWidth: 4
UseTab: Never
SortIncludes: false
AlignEscapedNewlines: DontAlign
# Запрещает clang-format схлопывать короткие функции в одну строку
AllowShortFunctionsOnASingleLine: None
AllowShortIfStatementsOnASingleLine: false
AllowShortBlocksOnASingleLine: Empty
AllowShortLambdasOnASingleLine: Empty
# Принудительно разрывает строку перед логическими операторами (||, &&)
BreakBeforeBinaryOperators: NonAssignment
# Включает перенос строк в выражениях return
ContinuationIndentWidth: 4
# Выравнивание самого двоеточия и запятых (замена старого стиля LeftAligned)
BreakConstructorInitializers: BeforeColon
# Запрещаем упаковывать элементы в одну строку (каждый элемент на новой строке)
PackConstructorInitializers: Never
# Настройки для переноса фигурной скобки конструктора на новую строку
BreakBeforeBraces: Custom
#BreakBeforeBraces: Attach
BraceWrapping:
AfterFunction: true
# Переносить открывающую скобку на новую строку после объявления enum
AfterEnum: true
SplitEmptyFunction: false
SplitEmptyRecord: false
SplitEmptyNamespace: false
# Ширина отступа для элементов инициализации (обычно 4)
ConstructorInitializerIndentWidth: 4
# Запрещает разбивать и переносить длинные строки в кавычках
BreakStringLiterals: false
# Отключает "компактный" режим для списков инициализации.
# Заставляет переносить элементы на новые строки, если они не влезают в ColumnLimit.
BinPackArguments: false
BinPackParameters: false
# Включает отступы для директив препроцессора после решетки #
IndentPPDirectives: BeforeHash
# Запрещает clang-format упаковывать перечисления в одну строку
AllowShortEnumsOnASingleLine: false
# Принудительно очищает лишние пробелы перед и после знаков препинания
SpaceAfterCStyleCast: false
SpaceBeforeAssignmentOperators: true
SpaceBeforeParens: ControlStatements
I have Sublime Text 4 build 4200 on macOS 15.7.7
When I try format .h-file with this code:
#pragma once
#include <mach-o/loader.h>
#include <cstdint>
#include <string>
#include <vector>
#include "common.h"
#include "pattern.h"
enum class AddressType : std::int8_t
{
RuntimeAddress,
FileOffset
};
enum class CpuArch : std::int8_t
{
arm64,
x64,
x86,
arm32,
unknown
};
struct ImageArch {
CpuArch arch;
std::string cpuType;
};
struct SegmentRange {
const uint8_t *ptr; // начало сегмента в памяти
uint64_t base; // runtime-адрес начала сегмента
size_t size; // размер сегмента в байтах
uint64_t fileoff; // fileoff сегмента
uint64_t sliceOffset; // смещение архитектурного слайса (для fat)
};
/**
* @struct DyldModuleInfo
*
* @brief Описывает один загруженный Mach-O модуль.
*
* Содержит:
* - полный путь к модулю
* - указатель на mach_header (ASLR-скорректированный)
* - slide (смещение ASLR)
*/
struct DyldModuleInfo {
std::string fullPath;
const mach_header_64 *header;
intptr_t slide;
// Возвращает имя файла (basename) из fullPath
std::string getBasename() const;
// Возвращает имя файла с расширением из fullPath
std::string getFilename() const;
// Оператор для сравнения. Set будет считать элементы одинаковыми, если их
// адреса заголовков равны
bool operator<(const DyldModuleInfo &other) const
{
return header < other.header;
}
// Определяем, как сравнивать объекты (по полю header)
bool operator==(const DyldModuleInfo &other) const
{
return header == other.header;
}
// Проверяет доступен ли данный модуль для использования
bool isModuleAccessible() const;
// Проверяет совпадает ли данный модуль с строкой которую нужно найти в пути
// этого модуля на диске
bool match(SearchString text) const;
// Возвращает строку с названием архитектуры (например, "ARM64" или "x86_64")
ImageArch getArchitectureName() const;
};
// хэшер (функтор), который берет адрес заголовка и делает из него хэш
struct DyldModuleHasher {
std::size_t operator()(const DyldModuleInfo &m) const
{
return std::hash<const void *>{}(m.header);
}
};
/**
* Ищет среди всех загруженных Mach-O модулей первый модуль,
* чьё имя файла (basename) совпадает с targetName, и возвращает
* его базовый адрес (ASLR-скорректированный адрес заголовка Mach-O).
*
* @param targetName Имя бинарника без пути (например, "libSystem.B.dylib").
* @return uintptr_t Базовый адрес первого найденного модуля,
* либо 0, если модуль не найден.
*/
uintptr_t getFirstModuleBaseAddressByName(const std::string &targetName);
/**
* Перебирает все загруженные Mach-O модули и собирает базовые адреса
* всех модулей, чьё имя файла (basename) совпадает с targetName.
* Возвращает список всех совпадений, поскольку в системе могут быть
* загружены несколько модулей с одинаковым именем, но разными путями.
*
* @param targetName Имя бинарника без пути (например, "libswiftCore.dylib").
* @return std::vector<DyldModuleInfo> Вектор структур с базовой информацией
* о всех найденных модулях. Пустой вектор, если совпадений нет.
*/
std::vector<DyldModuleInfo> getAllModulesBaseAddressesByName(const std::string &targetName);
namespace SymbolSearch {
symtab_command* FindSymTab(const struct mach_header_64* header);
segment_command_64* FindSegment(const struct mach_header_64* header, std::string_view segname);
std::vector<uintptr_t> FindSymbolInImage(const intptr_t slide, const struct mach_header_64* header, const SearchSymbol symbol);
/**
* @brief Ищет все символы из списка в заданном образе.
* @param slide ASLR слайд модуля
* @param header Заголовок Mach-O модуля
* @param symbols Вектор объектов SearchSymbol для поиска
* @return std::vector<std::vector<uintptr_t>> Список всех найденных адресов
*/
std::vector<std::vector<uintptr_t>> FindSymbolsInImage(const intptr_t slide,
const struct mach_header_64 *header,
const std::vector<SearchSymbol>& symbols);
}
SublimeClangFormat extension not touch namespace SymbolSearch.
But if I remove this code:
/**
* Перебирает все загруженные Mach-O модули и собирает базовые адреса
* всех модулей, чьё имя файла (basename) совпадает с targetName.
* Возвращает список всех совпадений, поскольку в системе могут быть
* загружены несколько модулей с одинаковым именем, но разными путями.
*
* @param targetName Имя бинарника без пути (например, "libswiftCore.dylib").
* @return std::vector<DyldModuleInfo> Вектор структур с базовой информацией
* о всех найденных модулях. Пустой вектор, если совпадений нет.
*/
std::vector<DyldModuleInfo> getAllModulesBaseAddressesByName(const std::string &targetName);
Then format again using SublimeClangFormat extension - namespace SymbolSearch will formatted without problems.
But if I will format code above using this service - https://clang-format-configurator.site/ or if I will format using command in terminal clang-format -style=file:/path/to/file/.clang-format -i /path/to/file//file.h - all it format code above without problems and without pre-removing part of code.
I do not know what the problem is, but the problem clearly lies in this extension and I cannot solve it in any way.
I will delete this extension and try to use the SublimeLinter + SublimeLinter-contrib-clang-format bundle.
UPDATE:
Looks like LSP-clangd also have format function using .clang-format file and no need additional extensions!
I have this
.clang-formatfile in root of project:I have Sublime Text 4 build 4200 on macOS 15.7.7
When I try format .h-file with this code:
SublimeClangFormat extension not touch
namespace SymbolSearch.But if I remove this code:
Then format again using SublimeClangFormat extension -
namespace SymbolSearchwill formatted without problems.But if I will format code above using this service - https://clang-format-configurator.site/ or if I will format using command in terminal
clang-format -style=file:/path/to/file/.clang-format -i /path/to/file//file.h- all it format code above without problems and without pre-removing part of code.I do not know what the problem is, but the problem clearly lies in this extension and I cannot solve it in any way.
I will delete this extension and try to use the SublimeLinter + SublimeLinter-contrib-clang-format bundle.
UPDATE:
Looks like LSP-clangd also have format function using .clang-format file and no need additional extensions!