INDENT(1)

الاسم
indent - يغير مظهر برنامج بلغة C عبر إدراج المسافات الفارغة أو حذفها.

موجز
indent [خيارات] [ملفات-المدخلات]

indent [خيارات] [ملف-مدخلات-واحد] [-o ملف-المخرجات]

indent --version

الوصف
وُلّدت صفحة الدليل هذه من الملف indent.texinfo. هذه هي طبعة "دليل indent"، للإصدار Indent، آخِر تحديث .

يُمكن استخدام برنامج indent لجعل الكود أسهل في القراءة. كما يمكنه التحويل من أسلوب كتابة C إلى آخر.

يفهم indent قدراً كبيراً من بناء جملة C، لكنه يحاول أيضًا التعامل مع البناء غير المكتمل والمشوه.

في الإصدار 1.2 والإصدارات الأحدث، أسلوب GNU للإزاحة هو الأسلوب المبدئي.

الخيارات

-as، --align-with-spaces
    إذا كنت تستخدم علامات الجدولة للإزاحة، فاستخدم المسافات للمحاذاة.
    انظر INDENTATION.

-bad، --blank-lines-after-declarations
    فرض أسطر فارغة بعد التصريحات.
    انظر BLANK LINES.

-bap، --blank-lines-after-procedures
    فرض أسطر فارغة بعد أجسام الإجراءات.
    انظر BLANK LINES.

-bbb، --blank-lines-before-block-comments
    فرض أسطر فارغة قبل تعليقات الكتل.
    انظر BLANK LINES.

-bbo، --break-before-boolean-operator
    تفضيل كسر الأسطر الطويلة قبل المعاملات المنطقية.
    انظر BREAKING LONG LINES.

-bc، --blank-lines-after-commas
    فرض سطر جديد بعد الفاصلة في التصريح.
    انظر DECLARATIONS.

-bl، --braces-after-if-line
    وضع الأقواس في سطر بعد if، وما إلى ذلك.
    انظر STATEMENTS.

-blf، --braces-after-func-def-line
    وضع الأقواس في السطر الذي يلي سطر تعريف الدالة.
    انظر DECLARATIONS.

-blin، --brace-indentn
    إزاحة الأقواس بمقدار n مسافة.
    انظر STATEMENTS.

-bls، --braces-after-struct-decl-line
    وضع الأقواس في السطر بعد أسطر تصريح struct.
    انظر DECLARATIONS.

-br، --braces-on-if-line
    وضع الأقواس في السطر مع if، وما إلى ذلك.
    انظر STATEMENTS.

-brf، --braces-on-func-def-line
    وضع الأقواس في سطر تعريف الدالة.
    انظر DECLARATIONS.

-brs، --braces-on-struct-decl-line
    وضع الأقواس في سطر تصريح struct.
    انظر DECLARATIONS.

-bs، --Bill-Shannon، --blank-before-sizeof
    وضع مسافة بين sizeof ومعاملها.
    انظر STATEMENTS.

-cn، --comment-indentationn
    وضع التعليقات على يمين الكود في العمود n.
    انظر COMMENTS.

-cbin، --case-brace-indentationn
    إزاحة الأقواس بعد لصيقة الحالة بمقدار N مسافة.
    انظر STATEMENTS.

-cdn، --declaration-comment-columnn
    وضع التعليقات على يمين التصريحات في العمود n.
    انظر COMMENTS.

-cdb، --comment-delimiters-on-blank-lines
    وضع محددات التعليقات في أسطر فارغة.
    انظر COMMENTS.

-cdw، --cuddle-do-while
    ضم while الخاصة بـ do {} while; و ‘}’ السابقة.
    انظر COMMENTS.

-ce، --cuddle-else
    ضم else و ‘}’ السابقة.
    انظر COMMENTS.

-cin، --continuation-indentationn
    إزاحة المتابعة بمقدار n مسافة.
    انظر STATEMENTS.

-clin، --case-indentationn
    إزاحة لصيقة الحالة بمقدار n مسافة.
    انظر STATEMENTS.

-cpn، --else-endif-columnn
    وضع التعليقات على يمين عبارتَي #else و #endif في العمود n.
    انظر COMMENTS.

-cs، --space-after-cast
    وضع مسافة بعد معامل التحويل القسري (cast).
    انظر STATEMENTS.

-dn، --line-comments-indentationn
    ضبط إزاحة التعليقات التي ليست على يمين الكود بمقدار n مسافة.
    انظر COMMENTS.

-bfda، --break-function-decl-args
    كسر السطر قبل جميع المعاملات في التصريح.
    انظر DECLARATIONS.

-bfde، --break-function-decl-args-end
    كسر السطر بعد آخِر معامل في التصريح.
    انظر DECLARATIONS.

-dj، --left-justify-declarations
    إذا استُخدم -cd 0، فإن التعليقات التي تلي التصريحات تُحاذى لليسار خلف التصريح.
    انظر DECLARATIONS.

-din، --declaration-indentationn
    وضع المتغيرات في العمود n.
    انظر DECLARATIONS.

-fc1، --format-first-column-comments
    تنسيق التعليقات في العمود الأول.
    انظر COMMENTS.

-fca، --format-all-comments
    لا تعطل كافة أشكال تنسيق التعليقات.
    انظر COMMENTS.

-fnc، --fix-nested-comments
    إصلاح التعليقات المتداخلة.
    انظر COMMENTS.

-gnu، --gnu-style
    استخدم أسلوب جنو في الترميز. هذا هو المبدئي.
    انظر COMMON STYLES.

-gts، --gettext-strings
    عامل gettext _("...") و N_("...") كسلاسل نصية بدلاً من دوال.
    انظر BREAKING LONG LINES.

-hnl، --honour-newlines
    تفضيل كسر الأسطر الطويلة عند موضع أسطر الإدخال الجديدة.
    انظر BREAKING LONG LINES.

-in، --indent-leveln
    ضبط مستوى الإزاحة بمقدار n مسافة.
    انظر INDENTATION.

-iln، --indent-labeln
    ضبط إزاحة اللصائق إلى العمود n.
    انظر INDENTATION.

-ipn، --parameter-indentationn
    إزاحة أنواع المعاملات في تعريفات الدوال بالنمط القديم بمقدار n مسافة.
    انظر INDENTATION.

-kr، --k-and-r-style
    استخدم أسلوب كيرنيغان وريتشي في الترميز.
    انظر COMMON STYLES.

-ln، --line-lengthn
    اضبط الحد الأقصى لطول السطر للأسطر غير التعليقية إلى n.
    انظر BREAKING LONG LINES.

-lcn، --comment-line-lengthn
    اضبط الحد الأقصى لطول السطر لتنسيق التعليقات إلى n.
    انظر COMMENTS.

-linux، --linux-style
    استخدم أسلوب ترميز لينكس.
    انظر COMMON STYLES.

-lp، --continue-at-parentheses
    حاذِ الأسطر الممتدة عند الأقواس.
    انظر INDENTATION.

-lps، --leave-preprocessor-space
    اترك مسافة بين ‘#’ وموجه المعالج المسبق.
    انظر INDENTATION.

-nlps، --remove-preprocessor-space
    أزل المسافة بين ‘#’ وموجه المعالج المسبق.
    انظر INDENTATION.

-nbad، --no-blank-lines-after-declarations
    لا تفرض أسطرًا فارغة بعد التصريحات.
    انظر BLANK LINES.

-nbap، --no-blank-lines-after-procedures
    لا تفرض أسطرًا فارغة بعد متن الإجراءات.
    انظر BLANK LINES.

-nbbo، --break-after-boolean-operator
    لا تفضل كسر الأسطر الطويلة قبل المعاملات المنطقية.
    انظر BREAKING LONG LINES.

-nbc، --no-blank-lines-after-commas
    لا تفرض أسطرًا جديدة بعد الفواصل في التصريحات.
    انظر DECLARATIONS.

-nbfda، --dont-break-function-decl-args
    لا تضع كل معطى في تصريح الدالة في سطر منفصل.
    انظر DECLARATIONS.

-ncdb، --no-comment-delimiters-on-blank-lines
    لا تضع محددات التعليقات في أسطر فارغة.
    انظر COMMENTS.

-ncdw، --dont-cuddle-do-while
    لا تضم } و while في تعبير do {} while;.
    انظر STATEMENTS.

-nce، --dont-cuddle-else
    لا تضم } و else.
    انظر STATEMENTS.

-ncs، --no-space-after-casts
    لا تضع مسافة بعد معاملات التحويل (cast).
    انظر STATEMENTS.

-ndjn، --dont-left-justify-declarations
    تُعامل التعليقات بعد التصريحات بنفس معاملة التعليقات بعد الجمل الأخرى.
    انظر DECLARATIONS.

-nfc1، --dont-format-first-column-comments
    لا تنسق التعليقات في العمود الأول كالمعتاد.
    انظر COMMENTS.

-nfca، --dont-format-comments
    لا تنسق أي تعليقات.
    انظر COMMENTS.

-ngts، --no-gettext-strings
    عامل تعبيرات gettext ‏_("...") و N_("...") كدوال عادية. هذا هو السلوك المبدئي.
    انظر BREAKING LONG LINES.

-nhnl، --ignore-newlines
    لا تفضل كسر الأسطر الطويلة عند موضع أسطر الإدخال الجديدة.
    انظر BREAKING LONG LINES.

-nip، --no-parameter-indentation
    إزاحة بعرض صفر للمعطيات.
    انظر INDENTATION.

-nlp، --dont-line-up-parentheses
    لا تحاذِ الأقواس.
    انظر STATEMENTS.

-npcs، --no-space-after-function-call-names
    لا تضع مسافة بعد الدالة في استدعاءات الدوال.
    انظر STATEMENTS.

-nprs، --no-space-after-parentheses
    لا تضع مسافة بعد كل ’(’ وقبل كل ’)’.
    انظر STATEMENTS.

-npsl، --dont-break-procedure-type
    ضع نوع الإجراء في نفس السطر مع اسمه.
    انظر DECLARATIONS.

-nsaf، --no-space-after-for
    لا تضع مسافة بعد كل for.
    انظر STATEMENTS.

-nsai، --no-space-after-if
    لا تضع مسافة بعد كل if.
    انظر STATEMENTS.

-nsaw، --no-space-after-while
    لا تضع مسافة بعد كل while.
    انظر STATEMENTS.

-nsc، --dont-star-comments
    لا تضع محرف ‘*’ على يسار التعليقات.
    انظر COMMENTS.

-nsob، --leave-optional-blank-lines
    لا تبتلع الأسطر الفارغة الاختيارية.
    انظر BLANK LINES.

-nss، --dont-space-special-semicolon
    لا تفرض مسافة قبل الفاصلة المنقوطة بعد جمل معينة. يعطل الخيار ‘-ss’.
    انظر STATEMENTS.

-ntac، --dont-tab-align-comments
    لا تملأ التعليقات بمسافات حتى أقرب علامة جدولة.
    انظر COMMENTS.

-nut، --no-tabs
    استخدم المسافات بدلاً من علامات الجدولة.
    انظر INDENTATION.

-nv، --no-verbosity
    عطّل الوضع المسهب.
    انظر MISCELLANEOUS OPTIONS.

-orig، --original
    استخدم أسلوب ترميز بيركلي الأصلي.
    انظر COMMON STYLES.

-npro، --ignore-profile
    لا تقرأ ملفات ‘.indent.pro’.
    انظر INVOKING INDENT.

-pal، --pointer-align-left
    ضع العلامات النجمية في تصريحات المؤشرات على يسار المسافات، بجانب الأنواع: ‘‘char* p’’.

-par، --pointer-align-right
    ضع العلامات النجمية في تصريحات المؤشرات على يمين المسافات، بجانب أسماء المتغيرات: ‘‘char *p’’. هذا هو السلوك المبدئي.

-pcs، --space-after-procedure-calls
    أدرج مسافة بين اسم الإجراء المستدعَى و ‘(’.
    انظر STATEMENTS.

-pin، --paren-indentationn
    حدد الإزاحة الإضافية لكل قوس مفتوح ’(’ عند كسر الجملة. انظر STATEMENTS.

-pmt، --preserve-mtime
    حافظ على أوقات الوصول والتعديل في ملفات المخرجات. انظر MISCELLANEOUS OPTIONS.

-ppin، --preprocessor-indentationn
    حدد إزاحة جمل المعالج المسبق الشرطية. انظر INDENTATION.

-prs، --space-after-parentheses
    ضع مسافة بعد كل ’(’ وقبل كل ’)’.
    انظر STATEMENTS.

-psl، --procnames-start-lines
    ضع نوع الإجراء في السطر الذي يسبق اسمه.
    انظر DECLARATIONS.

-saf، --space-after-for
    ضع مسافة بعد كل for.
    انظر STATEMENTS.

-sai، --space-after-if
    ضع مسافة بعد كل if.
    انظر STATEMENTS.

-sar، --spaces-around-initializers
    ضع مسافة بعد ‘{’ وقبل ‘}’ في الممهدات (initializers).
    انظر DECLARATIONS.

-saw، --space-after-while
    ضع مسافة بعد كل while.
    انظر STATEMENTS.

-sbin، --struct-brace-indentationn
    أزِح أقواس struct أو union أو enum بمقدار N من المسافات.
    انظر STATEMENTS.

-sc، --start-left-side-of-comments
    ضع محرف ‘*’ على يسار التعليقات.
    انظر COMMENTS.

-slc، --single-line-conditionals
    السماح للشروط غير المحصورة بين أقواس (if، وelse، وما إلى ذلك) بوضع عباراتها الداخلية في السطر نفسه.
    انظر STATEMENTS.

-sob، --swallow-optional-blank-lines
    ابتلع الأسطر الفارغة الاختيارية.
    انظر BLANK LINES.

-ss، --space-special-semicolon
    في عبارات for وwhile المكونة من سطر واحد، فُرضت مسافة فارغة قبل الفاصلة المنقوطة.
    انظر STATEMENTS.

-st، --standard-output
    اكتب إلى الخرج القياسي.
    انظر INVOKING INDENT.

-T  أخبر indent بأسماء الأنواع.
    انظر DECLARATIONS.

-tsn، --tab-sizen
    اضبط حجم علامة الجدولة على n من المسافات.
    انظر INDENTATION.

-ut، --use-tabs
    استخدم علامات الجدولة. هذا هو الخيار المبدئي.
    انظر INDENTATION.

-v، --verbose
    فعّل الوضع المسهب.
    انظر MISCELLANEOUS OPTIONS.

-version
    أخرج رقم إصدار indent.
    انظر MISCELLANEOUS OPTIONS.

استدعاء INDENT

بدءًا من الإصدار 1.3، أصبحت صيغة أمر indent هي:

indent [خيارات] [ملفات-المدخلات]

indent [خيارات] [ملف-مدخلات-واحد] [-o ملف-المخرجات]

تختلف هذه الصيغة عن الإصدارات السابقة وعن النسخ الأخرى من indent.

في الشكل الأول، حُدد ملف مدخلات واحد أو أكثر. ينشئ indent نسخة احتياطية لكل ملف، ويُستبدل الملف الأصلي بالنسخة التي تمت إزاحتها. راجع BACKUP FILES، للحصول على شرح لكيفية إنشاء النسخ الاحتياطية.

في الشكل الثاني، حُدد ملف مدخلات واحد فقط. في هذه الحالة، أو عند استخدام الدخل القياسي، يمكنك تحديد ملف مخرجات بعد خيار ‘-o’.

لجعل indent يكتب في الخرج القياسي، استخدم خيار ‘-st’. يُسمح بهذا فقط عندما يكون هناك ملف مدخلات واحد فقط، أو عند استخدام الدخل القياسي.

إذا لم تُسمَّ ملفات مدخلات، يُقرأ الدخل القياسي للمدخلات. وأيضًا، إذا حُدد اسم ملف يسمى ‘-’، فسيُقرأ الدخل القياسي.

على سبيل المثال، سيقوم كل من الأوامر التالية بإدخال البرنامج ‘slithy_toves.c’ وكتابة نصه المُزاح إلى ‘slithy_toves.out’:

indent slithy_toves.c -o slithy_toves.out

indent -st slithy_toves.c > slithy_toves.out

cat slithy_toves.c | indent -o slithy_toves.out

تتحكم معظم الخيارات الأخرى لـ indent في كيفية تنسيق البرامج. بدءًا من الإصدار 1.2، يتعرف indent أيضًا على اسم طويل لكل اسم خيار. تُسبق الخيارات الطويلة إما بـ ‘--’ أو ‘+’. [يُستبدل ‘+’ بـ ‘--’ لـ لحفاظ على الاتساق مع معيار POSIX.]
 في معظم هذا المستند، تُستخدم الأسماء التقليدية والقصيرة من أجل الإيجاز. راجع OPTION SUMMARY، للحصول على قائمة بالخيارات، بما في ذلك الأسماء الطويلة والقصيرة.

إليك مثال آخر:

indent -br test/metabolism.c -l85

سيؤدي هذا إلى إزاحة البرنامج ‘test/metabolism.c’ باستخدام خياري ‘-br’ و‘-l85’، وكتابة المخرجات مرة أخرى إلى ‘test/metabolism.c’، وكتابة المحتويات الأصلية لـ ‘test/metabolism.c’ في ملف احتياطي في الدليل ‘test’.

الاستدعاءات المكافئة باستخدام أسماء الخيارات الطويلة لهذا المثال ستكون:

indent --braces-on-if-line --line-length185 test/metabolism.c

indent +braces-on-if-line +line-length185 test/metabolism.c

إذا وجدت أنك تستخدم indent كثيرًا مع الخيارات نفسها، فيمكنك وضع هذه الخيارات في ملف يسمى ‘.indent.pro’. سيبحث indent عن ملف التشكيلة في ثلاثة أماكن. أولاً سيتحقق من متغير البيئة INDENT_PROFILE. إذا وُجد، فمن المتوقع أن تُسمي قيمته الملف الذي سيُستخدم. إذا لم يكن متغير البيئة موجودًا، يبحث indent عن ‘.indent.pro’ في الدليل الحالي ويستخدمه إذا وجد. وأخيرًا سيبحث indent في دليلك الرئيسي عن ‘.indent.pro’ ويستخدم ذلك الملف إذا وُجد. يختلف هذا السلوك عن سلوك النسخ الأخرى من indent، التي تُحمّل كلا الملفين إذا وُجدا معًا.

تنسيق ‘.indent.pro’ هو ببساطة قائمة من الخيارات، تمامًا كما تظهر في سطر الأوامر، مفصولة بمسافات بيضاء (علامات جدولة، مسافات، وأسطر جديدة). يمكن إحاطة الخيارات في ‘.indent.pro’ بتعليقات C أو C++، وفي هذه الحالة يتم تجاهلها.

Command line switches are handled after processing ‘ earlier, with one exception: Explicitly specified options always override background options (See COMMON STYLES). You can prevent indent from reading an ‘.indent.pro’ file by specifying the ‘-npro’ option.

ملفات النسخ الاحتياطي

بدءًا من الإصدار 1.3، ينشئ GNU indent ملفات احتياطية بأسلوب GNU، بالطريقة نفسها التي يتبعها GNU Emacs. وهذا يعني أنه يمكن إنشاء أسماء ملفات احتياطية إما بسيطة أو مرقمة.

تولّد أسماء ملفات النسخ الاحتياطي البسيطة عن طريق إلحاق لاحقة باسم الملف الأصلي. اللاحقة المبدئية هي المحرف الواحد ‘~’ (تلدة). وبالتالي، سيكون ملف النسخ الاحتياطي لـ ‘python.c’ هو ‘python.c~’.

بدلاً من القيمة المبدئية، يمكنك تحديد أي سلسلة كلحقة عن طريق ضبط متغير البيئة SIMPLE_BACKUP_SUFFIX إلى اللاحقة التي تفضلها.

تبدو إصدارات النسخ الاحتياطي المرقمة لملف ‘momeraths.c’ مثل ‘momeraths.c.~23~’، حيث 23 هو إصدار هذا النسخ الاحتياطي المحدد. عند إجراء نسخ احتياطي مرقم للملف ‘src/momeraths.c’، فسيُسمى ملف النسخ الاحتياطي ‘src/momeraths.c.~V~’، حيث V أكبر بواحد من أعلى إصدار موجود حاليًا في الدليل ‘src’. يتحكم متغير البيئة VERSION_WIDTH في عدد الأرقام، باستخدام حشو أصفار من اليسار عند الضرورة. على سبيل المثال، سيؤدي ضبط هذا المتغير إلى "2" إلى تسمية ملف النسخ الاحتياطي ‘momeraths.c.~04~’.

يُتحكم في نوع ملف النسخ الاحتياطي المُنشأ من خلال قيمة متغير البيئة VERSION_CONTROL. إذا كان السلسلة ‘simple’، فسيتم إنشاء نسخ احتياطية بسيطة فقط. إذا كانت قيمته السلسلة ‘numbered’، فسيتم إنشاء نسخ احتياطية مرقمة. إذا كانت قيمته ‘numbered-existing’، فسيتم إنشاء نسخ احتياطية مرقمة إذا كانت موجودة بالفعل نسخ احتياطية مرقمة للملف الذي تتم إزاحته؛ وإلا، فسيتم إنشاء نسخة احتياطية بسيطة. إذا لم يتم ضبط VERSION_CONTROL، فإن indent يفترض سلوك ‘numbered-existing’.

تستخدم النسخ الأخرى من indent اللاحقة ‘.BAK’ في تسمية ملفات النسخ الاحتياطي. يمكن محاكاة هذا السلوك عن طريق ضبط SIMPLE_BACKUP_SUFFIX إلى ‘.BAK’.

لاحظ أيضًا أن النسخ الأخرى من indent تنشئ نسخًا احتياطية في الدليل الحالي، بدلاً من دليل ملف المصدر كما يفعل GNU indent الآن.

الأنماط الشائعة

توجد عدة أنماط شائعة لشفرة C، بما في ذلك نمط GNU، ونمط Kernighan & Ritchie، ونمط Berkeley الأصلي. يمكن اختيار نمط بخيار خلفية واحد، والذي يحدد مجموعة من القيم لجميع الخيارات الأخرى. ومع ذلك، فإن الخيارات المحددة صراحةً تلغي دومًا الخيارات الضمنية لخيار الخلفية.

بدءًا من الإصدار 1.2، أصبح النمط المبدئي لـ GNU indent هو نمط GNU. وبالتالي، لم يعد من الضروري تحديد خيار ‘-gnu’ للحصول على هذا التنسيق، على الرغم من أن القيام بذلك لن يسبب خطأً. إعدادات الخيارات التي تتوافق مع نمط GNU هي:

-nbad -bap -nbc -bbo -bl -bli2 -bls -ncdb -nce -cp1 -cs -di2
-ndj -nfc1 -nfca -hnl -i2 -ip5 -lp -pcs -nprs -psl -saf -sai
-saw -nsc -nsob

نمط ترميز GNU هو النمط الذي يفضله مشروع GNU. إنه النمط الذي يشجعه وضع C في GNU Emacs والذي يُستخدم في أجزاء C من GNU Emacs. (يجب على الأشخاص المهتمين بكتابة برامج لمشروع GNU الحصول على نسخة من "معايير ترميز GNU"، والتي تغطي أيضًا القضايا الدلالية وقابلية النقل مثل استخدام الذاكرة، وحجم الأعداد الصحيحة، وما إلى ذلك).

يُستخدم نمط Kernighan & Ritchie في جميع أنحاء كتابهم المعروف "The C Programming Language". يُفعّل باستخدام خيار ‘-kr’. يتوافق نمط Kernighan & Ritchie مع مجموعة الخيارات التالية:

-nbad -bap -bbo -nbc -br -brs -c33 -cd33 -ncdb -ce -ci4 -cli0
-cp33 -cs -d0 -di1 -nfc1 -nfca -hnl -i4 -ip0 -l75 -lp -npcs
-nprs -npsl -saf -sai -saw -nsc -nsob -nss -par

لا يضع نمط Kernighan & Ritchie التعليقات على يمين الشفرة في العمود نفسه في جميع الأوقات (ولا يستخدم مسافة واحدة فقط على يمين الشفرة)، لذا اختار indent لهذا النمط العمود 33 بشكل تعسفي.

يمكن الحصول على نمط Berkeley indent الأصلي عن طريق تحديد ‘-orig’ (أو عن طريق تحديد ‘--original’، باستخدام اسم الخيار الطويل). هذا النمط مكافئ للإعدادات التالية:

-nbad -nbap -bbo -bc -br -brs -c33 -cd33 -cdb -ce -ci4 -cli0
-cp33 -di16 -fc1 -fca -hnl -i4 -ip4 -l75 -lp -npcs -nprs -psl
-saf -sai -saw -sc -nsob -nss -ts8

يُستخدم نمط Linux في شفرات نواة Linux والتعريفات. يجب أن تتبع الشفرات عمومًا نمط ترميز Linux ليتم قبولها. هذا النمط مكافئ للإعدادات التالية:

-nbad -bap -nbc -bbo -hnl -br -brs -c33 -cd33 -ncdb -ce -ci4
-cli0 -d0 -di1 -nfc1 -i8 -ip0 -l80 -lp -npcs -nprs -npsl -sai
-saf -sai -saw -ncs -nsc -sob -nfca -cp33 -ss -ts8 -il1

أسطر فارغة

تستخدم أنماط البرمجة المختلفة أسطرًا فارغة في أماكن مختلفة. يحتوي indent على عدد من الخيارات لإدراج أو حذف الأسطر الفارغة في أماكن محددة.

يؤدي خيار ‘-bad’ إلى قيام indent بفرض سطر فارغ بعد كل كتلة من التصريحات. يؤدي خيار ‘-nbad’ إلى عدم فرض indent لمثل هذه الأسطر الفارغة.

يفرض خيار ‘-bap’ سطرًا فارغًا بعد كل جسم إجراء. لا يفرض خيار ‘-nbap’ مثل هذا السطر الفارغ.

يفرض خيار ‘-bbb’ سطرًا فارغًا قبل كل تعليق محاط بصندوق (راجع COMMENTS.) لا يفرض خيار ‘-nbbb’ مثل هذه الأسطر الفارغة.

يؤدي خيار ‘-sob’ إلى قيام indent بابتلاع الأسطر الفارغة الاختيارية (أي سيُزال أي سطر فارغ اختياري موجود في المدخلات من المخرجات). إذا حُدد ‘-nsob’، فستُنسخ أي أسطر فارغة موجودة في ملف المدخلات إلى ملف المخرجات.

--blank-lines-after-declarations

يفرض خيار ‘-bad’ سطرًا فارغًا بعد كل كتلة من التصريحات. لا يضيف خيار ‘-nbad’ أي أسطر فارغة من هذا القبيل.

على سبيل المثال، بفرض وجود المدخلات
char *foo;
char *bar;
/* This separates blocks of declarations.  */
int baz;

ينتج indent -bad

char *foo;
char *bar;

/* This separates blocks of declarations.  */
int baz;

وينتج indent -nbad

char *foo;
char *bar;
/* This separates blocks of declarations.  */
int baz;

--blank-lines-after-procedures

يفرض خيار ‘-bap’ سطرًا فارغًا بعد كل جسم إجراء.

على سبيل المثال، بفرض وجود المدخلات

int
foo ()
{
  puts("Hi");
}
/* The procedure bar is even less interesting.  */
char *
bar ()
{
  puts("Hello");
}

ينتج indent -bap

int
foo ()
{
  puts ("Hi");
}

/* The procedure bar is even less interesting.  */
char *
bar ()
{
  puts ("Hello");
}

وينتج indent -nbap

int
foo ()
{
  puts ("Hi");
}
/* The procedure bar is even less interesting.  */
char *
bar ()
{
  puts ("Hello");
}

لن يُضاف أي سطر فارغ بعد الإجراء foo.

تعليقات

نسق indent تعليقات C وC++. تبدأ تعليقات C بـ ‘/*’، وتنتهي بـ ‘*/’ وقد تحتوي على محارف سطر جديد. تبدأ تعليقات C++ بالمحدد ‘//’ وتنتهي عند السطر الجديد.

يعالج indent التعليقات بشكل مختلف اعتمادًا على سياقها. يحاول indent التمييز بين التعليقات التي تلي العبارات، والتعليقات التي تلي التصريحات، والتعليقات التي تلي توجيهات المعالج المسبق، والتعليقات التي لا تسبقها شفرة من أي نوع، أي أنها تبدأ نص السطر (وإن لم يكن ذلك بالضرورة في العمود 1).

يميز indent أيضًا بين التعليقات الموجودة خارج الإجراءات والمجمعات، وتلك الموجودة داخلها. وبوجه خاص، ستتم إزاحة التعليقات التي تبدأ سطرًا داخل إجراء إلى العمود الذي تتم فيه إزاحة الشفرة حاليًا. الاستثناء من ذلك هو التعليق الذي يبدأ في العمود أقصى اليسار؛ حيث يُخرج هذا التعليق في ذلك العمود.

يحاول indent ترك التعليقات المحاطة بصندوق دون تعديل. الفكرة العامة لمثل هذا التعليق هي أنه محاط بمستطيل أو ‘‘صندوق’’ من النجوم أو الشرطات لتمييزه بصريًا. وبشكل أكثر دقة، تُعرف التعليقات المحاطة بصندوق بأنها تلك التي يتبع فيها ‘/*’ الأولي مباشرةً المحرف ‘*’، أو ‘=’، أو ‘_’، أو ‘-’، أو تلك التي يكون فيها محدد بداية التعليق (‘/*’) في سطر بمفرده، ويبدأ السطر التالي بـ ‘*’ في العمود نفسه الذي توجد فيه نجمة محدد الافتتاح.

من أمثلة التعليقات المحاطة بصندوق:

/**********************
 * Comment in a box!! *
 **********************/

       /*
        * A different kind of scent,
        * for a different kind of comment.
        */

يحاول indent ترك التعليقات المحاطة بصندوق تمامًا كما هي موجودة في ملف المصدر. وبالتالي تظل إزاحة التعليق دون تغيير، ولا يتم التحقق من طوله بأي شكل من الأشكال. التعديل الوحيد هو أنه قد يُحول محرف علامة جدولة مضمن إلى العدد المناسب من المسافات.

إذا حُدد خيار ‘-bbb’، فستُسبق جميع هذه التعليقات المحاطة بصندوق بسطر فارغ، ما لم يسبق مثل هذا التعليق شفرة.

يمكن تنسيق التعليقات التي ليست محاطة بصندوق، مما يعني كسر السطر ليتناسب مع هامش أيمن وتعبئته من اليسار بمسافات بيضاء. تعادل أسطر المحارف الجديدة المنفردة مسافة، ولكن الأسطر الفارغة (سطران أو أكثر من محارف السطر الجديد متتالية) تُعتبر فاصل فقرة. يُفعّل تنسيق التعليقات التي تبدأ بعد العمود الأول باستخدام خيار ‘-fca’. لتنسيق تلك التي تبدأ في العمود الأول، حدد ‘-fc1’. هذا التنسيق معطل بشكل مبدئي.

يكون الهامش الأيمن للتنسيق مبدئيًا 78، ولكن يمكن تغييره باستخدام خيار ‘-lc’. إذا كان الهامش المحدد لا يسمح بطباعة التعليق، فسيتم تمديد الهامش آليًا طوال مدة ذلك التعليق. لا يتم احترام الهامش إذا لم يتم تنسيق التعليق.

إذا حُدد خيار ‘-fnc’، فسيتم استبدال تسلسل المحارف هذا في جميع التعليقات التي تحتوي على ‘/*’ مضمنة بمسافة يتبعها المحرف ‘*’ وبالتالي التخلص من التداخل.

إذا بدأ التعليق سطرًا (أي لا يوجد نص برنامج على يساره)، فستتم إزاحته إلى العمود الذي وُجد فيه ما لم يكن التعليق داخل كتلة من الشفرة. في هذه الحالة، سيتمت محاذاة هذا التعليق مع الشفرة المزاحة لتلك الكتلة (ما لم يبدأ التعليق في العمود الأول). قد تتأثر هذه المحاذاة بخيار ‘-d’، الذي يحدد المقدار الذي يتم من خلاله نقل هذه التعليقات إلى اليسار، أو تقليل إزاحتها. على سبيل المثال، يضع ‘-d2’ التعليقات بمقدار مسافتين إلى يسار الشفرة. بشكل مبدئي، تُحاذى التعليقات مع الشفرة، ما لم تبدأ في العمود الأول، وفي هذه الحالة تُترك هناك بشكل مبدئي --- لمحاذاتها مع الشفرة، حدد ‘-fc1’.

ستظهر التعليقات الموجودة على يمين الشفرة بشكل مبدئي في العمود 33. يمكن تغيير ذلك بأحد ثلاثة خيارات. سيحدد ‘-c’ العمود للتعليقات التي تلي الشفرة، ويحدد ‘-cd’ العمود للتعليقات التي تلي التصريحات، ويحدد ‘-cp’ العمود للتعليقات التي تلي توجيهات المعالج المسبق #else و#endif. يمكن استخدام ‘-dj’ مع ‘-cd0’ لمنع محاذاة التعليقات على يمين التصريحات، مما يجعل التعليق يلي علامة جدولة واحدة من نهاية التصريح. عادة ما يؤدي ‘-cd0’ إلى جعل ‘-c’ فعالاً.

إذا تجاوزت الشفرة الموجودة على يسار التعليق عمود البداية، فسيُمدد عمود التعليق إلى عمود علامة التبويب التالية بعد نهاية الشفرة، ما لم يُحدد الخيار ‘-ntac’. وفي حالة موجهات المعالج المسبق، تُمدد التعليقات بمقدار مسافة واحدة بعد نهاية الموجه. يستمر هذا التمديد فقط لمخرجات ذلك التعليق المعين.

يضع الخيار ‘-cdb’ محددات التعليق في أسطر فارغة. وبذلك، يمكن تحويل تعليق من سطر واحد مثل /* Loving hug */ إلى:

/*
   Loving hug
 */

يمكن وضع نجوم في بداية التعليقات متعددة الأسطر باستخدام الخيار ‘-sc’. وبذلك، يمكن تحويل التعليق ذي السطر الواحد أعلاه (باستخدام ‘-cdb -sc’) إلى:

/*
 * Loving hug
 */

البيانات (STATEMENTS)

يحدد الخيار ‘-br’ أو ‘-bl’ كيفية تنسيق الأقواس الحاصرة.

ينسق الخيار ‘-br’ أقواس البيانات هكذا:

if (x > 0) {
  x--;
}

ينسق الخيار ‘-bl’ الأقواس هكذا:

if (x > 0)
  {
    x--;
  }

إذا استخدمت الخيار ‘-bl’، فقد ترغب أيضًا في تحديد الخيار ‘-bli’. يحدد هذا الخيار عدد المسافات التي تُزاح بها الأقواس الحاصرة. يعطي ‘-bli2’، وهو المبدئي، النتيجة الموضحة أعلاه. بينما يؤدي ‘-bli0’ إلى ما يلي:

if (x > 0)
{
  x--;
}

إذا كنت تستخدم الخيار ‘-br’، فمن المحتمل أنك تريد أيضًا استخدام الخيار ‘-ce’. يؤدي هذا إلى جعل else في بنية if-then-else تلتصق بـ ‘}’ التي تسبقها مباشرة. على سبيل المثال، مع ‘-br -ce’ تحصل على ما يلي:

if (x > 0) {
  x--;
} else {
  fprintf (stderr, "...something wrong?\n");
}

مع الخيار ‘-br -nce’ سيظهر ذلك الكود كالتالي

if (x > 0) {
  x--;
}
else {
  fprintf (stderr, "...something wrong?\n");
}

يحدث استثناء لهذا السلوك عندما يكون هناك تعليق بين قوس الإغلاق وعبارة else التالية. بينما يتسبب الخيار ‘-br’ في قفز قوس الفتح فوق التعليق، إلا أن else لا تقفز فوق التعليق لتلتصق بالقوس (cuddle) لأن هناك احتمالية كبيرة لتغير معنى التعليق.

يتسبب الخيار ‘-cdw’ في جعل while في حلقة do-while تلتصق بـ ‘}’ الذي يسبقها مباشرة. على سبيل المثال، مع الخيار ‘-cdw’ ستحصل على ما يلي:

do {
  x--;
} while (x);

مع الخيار ‘-ncdw’ سيظهر ذلك الكود كالتالي

do {
  x--;
}
while (x);

يسمح الخيار ‘-slc’ بظهور الشرط غير المحاط بأقواس وعبارته الداخلية على السطر نفسه. على سبيل المثال:

if (x) x--;
else x++;

بدون الخيار ‘-slc’ سيظهر ذلك الكود كالتالي

if (x)
  x--;
else
  x++;

يحدد الخيار ‘-cli’ عدد المسافات التي يجب أن تُزاح إليها لصائق case جهة اليمين بالنسبة لعبارة switch الحاوية لها.

يعطي الوضع المبدئي كودًا مثل:

switch (i)
  {
  case 0:
    break;
  case 1:
    {
      ++i;
    }
  default:
    break;
  }

باستخدام ‘-cli2’ سيصبح كالتالي:

switch (i)
  {
    case 0:
      break;
    case 1:
      {
        ++i;
      }
    default:
      break;
  }

يمكن التحكم في إزاحة الأقواس أسفل عبارة case باستخدام الخيار ‘-cbin’. على سبيل المثال، يؤدي استخدام ‘-cli2 -cbi0’ إلى:

switch (i)
  {
    case 0:
      break;
    case 1:
    {
      ++i;
    }
    default:
      break;
  }

إذا كانت الفاصلة المنقوطة على نفس السطر مع عبارة for أو while، فسيتسبب الخيار ‘-ss’ في وضع مسافة قبل الفاصلة المنقوطة. يؤكد هذا على الفاصلة المنقوطة، مما يوضح أن جسم عبارة for أو while عبارة عن جملة فارغة. يعطل ‘-nss’ هذه الميزة.

يتسبب الخيار ‘-pcs’ في وضع مسافة بين اسم الإجراء المستدعى وبين ‘(’ (على سبيل المثال، puts ("Hi");. بينما سيعطي الخيار ‘-npcs’ النتيجة puts("Hi");).

إذا حُدد الخيار ‘-cs’، يضع indent مسافة بين عامل القسر (cast) والكائن المراد قسره. يضمن الخيار ‘-ncs’ عدم وجود مسافة بين عامل القسر والكائن. تذكر أن indent لا يعرف سوى أنواع بيانات C القياسية، لذا لا يمكنه التعرف على الأنواع التي يحددها المستخدم في عمليات القسر. وبالتالي، لا تُعامل (mytype)thing كعملية قسر.

يضمن الخيار ‘-bs’ وجود مسافة بين الكلمة المفتاحية sizeof ومعاملها. في بعض الإصدارات، يُعرف هذا باسم خيار ‘Bill_Shannon’.

يجبر الخيار ‘-saf’ وضع مسافة بين for والقوس الذي يليها. هذا هو السلوك المبدئي.

يجبر الخيار ‘-sai’ وضع مسافة بين if والقوس الذي يليها. هذا هو السلوك المبدئي.

يجبر الخيار ‘-saw’ وضع مسافة بين while والقوس الذي يليها. هذا هو السلوك المبدئي.

يتسبب الخيار ‘-prs’ في فصل جميع الأقواس بمسافة عما بداخلها. على سبيل المثال، يؤدي استخدام ‘-prs’ إلى كود كالتالي:

  while ( ( e_code - s_code ) < ( dec_ind - 1 ) )
    {
      set_buf_break ( bb_dec_ind );
      *e_code++ = ’ ’;
    }

التصريحات

بشكل مبدئي، سيقوم indent بمحاذاة المعرفات في العمود المحدد بواسطة الخيار ‘-di’. على سبيل المثال، يجعل ‘-di16’ الأمور تبدو كالتالي:

int             foo;
char           *bar;

يمكن استخدام قيمة صغيرة (مثل واحد أو اثنين) للخيار ‘-di’ لوضع المعرفات في أول موضع متاح؛ على سبيل المثال:

int foo;
char *bar;

ستظل القيمة المعطاة للخيار ‘-di’ تؤثر على المتغيرات التي توضع في أسطر منفصلة عن أنواعها، على سبيل المثال ‘-di2’ سيؤدي إلى:

int
  foo;

إذا حُدد الخيار ‘-bc’، فسيُفرض سطر جديد بعد كل فاصلة في التصريح. على سبيل المثال،

int a,
  b,
  c;

مع الخيار ‘-nbc’ سيبدو ذلك كالتالي

int a, b, c;

يتسبب الخيار ‘-bfda’ في فرض سطر جديد بعد الفاصلة التي تفصل بين معاملات تصريح الدالة. ستظهر المعاملات بمستوى إزاحة أعمق بدرجة واحدة من تصريح الدالة. هذا مفيد بشكل خاص للدوال ذات قوائم المعاملات الطويلة. يتسبب الخيار ‘-bfde’ في فرض سطر جديد قبل قوس الإغلاق لتصريح الدالة. لكلا الخيارين، الإعداد المبدئي هو ’n’: أي -nbfda و -nbfde.

على سبيل المثال،

void foo (int arg1, char arg2, int *arg3, long arg4, char arg5);
مع الخيار ‘-bfda’ سيبدو ذلك كالتالي

void foo (
    int arg1,
    char arg2,
    int *arg3,
    long arg4,
    char arg5);

وبالإضافة إلى ذلك، مع الخيار ‘-bfde’ سيبدو كالتالي

void foo (
    int arg1,
    char arg2,
    int *arg3,
    long arg4,
    char arg5
    );

يتسبب الخيار ‘-psl’ في وضع نوع الإجراء الذي يجري تعريفه في السطر الذي يسبق اسم الإجراء. هذا النمط مطلوب ليعمل برنامج etags بشكل صحيح، وكذلك لبعض وظائف c-mode في Emacs.

يجب استخدام الخيار ‘-T’ لإخبار indent بأسماء كافة أسماء الأنواع في برنامجك التي عُرّفت بواسطة typedef. يمكن تحديد ‘-T’ أكثر من مرة، وتُستخدم جميع الأسماء المحددة. على سبيل المثال، إذا كان برنامجك يحتوي على

typedef unsigned long CODE_ADDR;
typedef enum {red, blue, green} COLOR;

فستستخدم الخيارات ‘-T CODE_ADDR -T COLOR’.

يحدد الخيار ‘-brs’ أو ‘-bls’ كيفية تنسيق الأقواس في تصريحات السجلات (struct). يقوم الخيار ‘-brs’ بتنسيق الأقواس كالتالي:

struct foo {
  int x;
};

يقوم الخيار ‘-bls’ بتنسيقها كالتالي:

struct foo
{
  int x;
};

على غرار خيارات أقواس السجلات ‘-brs’ و ‘-bls’،
 تحدد خيارات أقواس الدوال ‘-brf’ أو ‘-blf’ كيفية تنسيق الأقواس في تعريفات الدوال. يقوم الخيار ‘-brf’ بتنسيق الأقواس كالتالي:

int one(void) {
  return 1;
};

يقوم الخيار ‘-blf’ بتنسيقها كالتالي:

int one(void)
{
  return 1;
};

يؤثر الخيار ‘-sar’ على كيفية تصيير indent لقوائم التهيئة. بدون ‘-sar’ تُنسق كالتالي:

int a[] = {1, 2, 3, 4};

struct s {
  const char *name;
  int x;
} a[] = {
  {"name", 0},
  {"a", 1}
};

مع ‘-sar’ تُنسق كالتالي، مع وجود مسافات داخل الأقواس:

int a[] = { 1, 2, 3, 4 };

struct s {
  const char *name;
  int x;
} a[] = {
  { "name", 0 },
  { "a", 1 }
};

الإزاحة

تعد القضية الأكثر أساسية وإثارة للجدل فيما يتعلق بتنسيق الكود هي كيفية تحقيق الإزاحة بالضبط. لحسن الحظ، يدعم indent عدة أنماط مختلفة للإزاحة. الوضع المبدئي هو استخدام علامات الجدولة (tabs) للإزاحة، وهو ما يحدده الخيار ‘-ut’. وبافتراض أن حجم الجدولة المبدئي هو 8، سيبدو الكود كالتالي:

int a(int b)
{
        return b;
|------|
 1 tab
}

بالنسبة لأولئك الذين يفضلون المسافات على علامات الجدولة، يوفر ‘indent’ الخيار ‘-nut’. سيبدو الكود نفسه كالتالي:

int a(int b)
{
        return b;
|------|
8 spaces
}

هناك مسألة أخرى في تنسيق الكود وهي مدى إزاحة كل سطر عن الهامش الأيسر. عند مواجهة بداية عبارة مثل if أو for، يزداد مستوى الإزاحة بالقيمة المحددة في الخيار ‘-i’. على سبيل المثال، استخدم ‘-i8’ لتحديد إزاحة بثمانية محارف لكل مستوى. عندما تنقسم عبارة على سطرين، يُزاح السطر الثاني بعدد من المسافات الإضافية المحددة في الخيار ‘-ci’. القيمة المبدئية لـ ‘-ci’ هي 0. ومع ذلك، إذا حُدد الخيار ‘-lp’، وكان السطر يحتوي على قوس فتح لم يُغلق في ذلك السطر، فستتم محاذاة أسطر التكملة لتبدأ من موضع المحرف الذي يلي قوس الفتح مباشرة. ينطبق هذا المعالجة أيضًا على ‘[’ وعلى ‘{’ عندما تظهر في قوائم التهيئة. على سبيل المثال، قد تبدو قطعة من كود مكمل كالتالي مع تفعيل ‘-nlp -ci3’:

  p1 = first_procedure (second_procedure (p2, p3),
     third_procedure (p4, p5));

مع تفعيل ‘-lp’، يبدو الكود أكثر وضوحًا نوعًا ما:

  p1 = first_procedure (second_procedure (p2, p3),
                        third_procedure (p4, p5));

عندما تنقسم عبارة بين زوجين أو أكثر من الأقواس (...), يتسبب كل زوج إضافي في إزاحة إضافية لمستوى الإزاحة:

if ((((i < 2 &&
        k > 0) || p == 0) &&
    q == 1) ||
  n = 0)

يمكن استخدام الخيار ‘-ipN’ لضبط الإزاحة الإضافية لكل قوس. على سبيل المثال، الخيار ‘-ip0’ سيقوم بتنسيق ما سبق كما يلي:

if ((((i < 2 &&
  k > 0) || p == 0) &&
  q == 1) ||
  n = 0)

يفترض indent أن علامات الجدولة توضع على فترات منتظمة في كل من دفقات محارف المدخلات والمخرجات. هذه الفترات تكون بعرض 8 أعمدة بشكل مبدئي، ولكن (بدءًا من الإصدار 1.2) يمكن تغييرها بواسطة الخيار ‘-ts’. تُعامل علامات الجدولة كعدد مكافئ من المسافات.

بشكل مبدئي، سيستخدم indent علامات الجدولة للإزاحة قدر الإمكان، ثم يكمل بالمسافات حتى الوصول إلى الموضع المطلوب. ومع ذلك، مع الخيار ‘-as’، ستُستخدم المسافات للمحاذاة وراء مستوى الإزاحة الحالي. بشكل مبدئي، بافتراض تفعيل ‘-lp’، سيُزاح الكود كالتالي (حيث يمثل ‘t’ علامات الجدولة، و ‘s’ يمثل المسافات):

unsigned long really_long_proc_name(unsigned long x, unsigned long y,
                                    int a)
|------||-------||------||-------|__
   t        t       t       t     ss
{
        p1 = first_procedure (second_procedure (p2, p3),
                              third_procedure (p4, p5));
|------||------||------|_____
   t       t       t    sssss
}

هذا جيد، إذا افترضت أن كل من يقرأ الكود سيحترم افتراضك لعلامات جدولة بمقدار 8 مسافات. إذا كان القارئ يستخدم علامات جدولة بمقدار 4 مسافات، فسيبدو كالتالي:

unsigned long really_long_proc_name(unsigned long x, unsigned long y,
                      int a)
|---||---||---||---|__
  t    t    t    t  ss
{
        p1 = first_procedure (second_procedure (p2, p3),
                     third_procedure (p4, p5));
|---||---||---|______
  t    t    t  ssssss
}

يعالج الخيار ‘-as’ هذا الأمر بحيث يظهر الكود بشكل متسق بغض النظر عن حجم الجدولة الذي يستخدمه المستخدم لقراءة الكود. يبدو هذا كالتالي:

unsigned long really_long_proc_name(unsigned long x, unsigned long y,
                                    int a)
____________________________________
ssssssssssssssssssssssssssssssssssss
{
        p1 = first_procedure (second_procedure (p2, p3),
                              third_procedure (p4, p5));
|------|______________________
   t    ssssssssssssssssssssss
}

يتم التحكم في إزاحة تصريحات الأنواع في تعريفات الدوال بالنمط القديم بواسطة المعامل ‘-ip’. هذا معامل رقمي يحدد عدد المسافات لإزاحة تصريحات الأنواع. على سبيل المثال، يجعل الإعداد المبدئي ‘-ip5’ التعريفات تبدو كالتالي:

char *
create_world (x, y, scale)
     int x;
     int y;
     float scale;
{
  . . .
}

للتوافق مع الإصدارات الأخرى من indent، يُوفَّر الخيار ‘-nip’، والذي يكافئ ‘-ip0’.

تسمح ANSI C بوضع مسافات بيضاء في أسطر أوامر المعالج المسبق بين المحرف ‘#’ واسم الأمر. يحذف indent هذه المسافة مبدئيًا، ولكن تحديد الخيار ‘-lps’ يوجه indent لترك هذه المسافة دون تعديل. يتجاوز الخيار ‘-ppi’ الخيارين ‘-nlps’ و ‘-lps’.

يمكن استخدام هذا الخيار لطلب إزاحة جمل المعالج المسبق الشرطية بعدد محدد من المسافات، على سبيل المثال مع الخيار ‘-ppi 3’

#if X
#if Y
#define Z 1
#else
#define Z 0
#endif
#endif
يصبح
#if X
#   if Y
#      define Z 1
#   else
#      define Z 0
#   endif
#endif

يضبط هذا الخيار الإزاحة التي ستوضع عندها اللصيقة (باستثناء لصائق case). إذا ضُبط على الصفر أو رقم موجب، فإن هذا يشير إلى مدى البعد عن الهامش الأيسر لإزاحة اللصيقة. أما إذا ضُبط على رقم سالب، فإن هذا يشير إلى مدى الرجوع للخلف عن مستوى الإزاحة الحالي لوضع اللصيقة. الإعداد المبدئي هو -2 والذي يطابق سلوك الإصدارات السابقة من indent. لاحظ أن هذا المعامل لا يؤثر على وضع لصائق case؛ راجع معامل ‘-cli’ لذلك. على سبيل المثال مع الخيار ‘-il 1’

group
function()
{
    if (do_stuff1() == ERROR)
        goto cleanup1;

    if (do_stuff2() == ERROR)
        goto cleanup2;

    return SUCCESS;

  cleanup2:
    do_cleanup2();

  cleanup1:
    do_cleanup1();

    return ERROR;
}
يصبح
group
function()
{
    if (do_stuff1() == ERROR)
        goto cleanup1;

    if (do_stuff2() == ERROR)
        goto cleanup2;

    return SUCCESS;

 cleanup2:
    do_cleanup2();

 cleanup1:
    do_cleanup1();

    return ERROR;
}

كسر الأسطر الطويلة

باستخدام الخيار ‘-ln’، أو ‘--line-lengthn’، يمكن تحديد الحد الأقصى لطول سطر من كود C، دون تضمين التعليقات المحتملة التي تليه.

عندما تصبح الأسطر أطول من طول السطر المحدد، يحاول GNU indent كسر السطر في مكان منطقي. هذا الأمر جديد منذ الإصدار 2.1 ولكنه ليس ذكيًا أو مرنًا بما يكفي بعد.

تتوفر حاليًا ثلاثة خيارات تسمح للمرء بالتدخل في الخوارزمية التي تحدد مكان كسر السطر.

يجعل الخيار ‘-bbo’ برنامج GNU indent يفضل كسر الأسطر الطويلة قبل المعاملات المنطقية && و ||. أما الخيار ‘-nbbo’ فيجعل GNU indent لا يفضل ذلك. على سبيل المثال، الخيار المبدئي ‘-bbo’ (مع ‘--line-length60’ و ‘--ignore-newlines’) يجعل الكود يبدو كالتالي:

  if (mask
      && ((mask[0] == ’\0’)
          || (mask[1] == ’\0’
              && ((mask[0] == ’0’) || (mask[0] == ’*’)))))

سيؤدي استخدام الخيار ‘-nbbo’ إلى جعله يبدو كالتالي:

  if (mask &&
      ((mask[0] == ’\0’) ||
       (mask[1] == ’\0’ &&
        ((mask[0] == ’0’) || (mask[0] == ’*’)))))

أما الخيار المبدئي ‘-hnl’، فإنه يحترم الأسطر الجديدة في ملف المدخلات عن طريق منحها أعلى أولوية ممكنة لكسر الأسطر عندها. على سبيل المثال، عندما يبدو ملف المدخلات هكذا:

  if (mask
      && ((mask[0] == ’\0’)
      || (mask[1] == ’\0’ && ((mask[0] == ’0’) || (mask[0] == ’*’)))))

فإن استخدام الخيار ‘-hnl’، أو ‘--honour-newlines’، مع خيار ‘-nbbo’ المذكور سابقًا و ‘--line-length60’، سيؤدي إلى جعل المخرجات ليست كما في المثال الأخير، بل سيفضل الكسر في المواضع التي كُسر فيها الكود في ملف المدخلات:

  if (mask
      && ((mask[0] == ’\0’)
          || (mask[1] == ’\0’ &&
              ((mask[0] == ’0’) || (mask[0] == ’*’)))))

الفكرة من هذا الخيار هي أن الأسطر الطويلة جدًا، والمكسورة بالفعل، لن يمسها GNU indent. ومع ذلك، يجب تمرير الكود الفوضوي حقًا عبر indent مرة واحدة على الأقل باستخدام خيار ‘--ignore-newlines’.

يؤثر خيار ‘-gts’ على كيفية التعامل مع ماكروهات gettext القياسية _() و N_(). السلوك المبدئي (أو استخدام ‘-ngts’) يجعل indent يعاملها كما يعامل الدوال الأخرى، بحيث يتم كسر السلسلة الطويلة كما في المثال التالي.

  if (mask)
    {
      warning (_
               ("This is a long string that stays together."));
    }

باستخدام خيار ‘-gts’، تُعامل الشرطة السفلية كجزء من السلسلة النصية، مما يبقيها مرتبطة بالسلسلة، ويحترم حقيقة أن gettext يوفر سلسلة مترجمة بشكل غير مزعج. يعمل هذا فقط إذا كانت _(" معًا كوحدة واحدة في بداية السلسلة و ") معًا كوحدة واحدة في النهاية.

  if (mask)
    {
      warning
        (_("This is a long string that stays together."));
    }

تعطيل التنسيق

قد يُعطَّل تنسيق كود C لأجزاء من البرنامج عن طريق تضمين تعليقات تحكم خاصة في البرنامج. لإيقاف التنسيق لقسم من البرنامج، ضع تعليق التحكم المعطل /* *INDENT-OFF* */ في سطر منفرد قبل ذلك القسم مباشرة. تخرج نصوص البرنامج التي تُفحص بعد تعليق التحكم هذا تمامًا كما في المدخلات دون أي تعديلات حتى يُفحص تعليق التمكين المقابل في سطر منفرد. تعليق تحكم التمكين هو /* *INDENT-ON* */، وأي نص يتبع التعليق في نفس السطر يخرج أيضًا غير منسق. يبدأ التنسيق مرة أخرى من سطر المدخلات الذي يلي تعليق تحكم التمكين.

بشكل أكثر دقة، لا يحاول indent التحقق من محدد الإغلاق (*/) لهذه التعليقات في C، وأي مسافات بيضاء في السطر تكون شفافة تمامًا.

تعمل تعليقات التحكم هذه أيضًا في تنسيقات C++ الخاصة بها، وهي // *INDENT-OFF* و // *INDENT-ON*.

تجدر الإشارة إلى أن الحالة الداخلية لـ indent تظل دون تغيير طوال القسم غير المنسق. وبالتالي، على سبيل المثال، قد يؤدي إيقاف التنسيق في منتصف دالة واستئنافه بعد نهاية الدالة إلى نتائج غريبة. لذا من الحكمة أن يكون المرء نمطيًا إلى حد ما في اختيار الكود المراد تركه دون تنسيق.

كملاحظة تاريخية، أنتجت بعض الإصدارات السابقة من indent رسائل خطأ تبدأ بـ *INDENT**. كُتبت تلك الإصدارات من indent لتجاهل أي أسطر نص مدخلة تبدأ برسائل الخطأ هذه. حُذفت هذه الميزة من GNU indent.

خيارات متنوعة

لمعرفة إصدار indent لديك، استخدم الأمر indent -version. سيبلغ هذا عن رقم إصدار indent، دون القيام بأي من المعالجة العادية.

يمكن استخدام الخيار ‘-v’ لتشغيل الوضع المسهب. في الوضع المسهب، يبلغ indent عندما يقسم سطرًا واحدًا من المدخلات إلى سطرين أو أكثر من المخرجات، ويعطي بعض إحصائيات الحجم عند الانتهاء.

يجعل الخيار ‘-pmt’ برنامج indent يحافظ على أوقات الوصول والتعديل على ملفات المخرجات. استخدام هذا الخيار له ميزة أن تشغيل indent على جميع ملفات المصدر والترويسة في مشروع ما لن يجعل make يعيد بناء جميع الأهداف. هذا الخيار متاح فقط في أنظمة التشغيل التي تحتوي على دالة POSIX utime(2).

العلل

يرجى الإبلاغ عن أي علل إلى bug-indent@gnu.org.

عند تشغيل indent مرتين على ملف، بنفس التشكيلة، يجب ألا يغير أبدًا هذا الملف في المرة الثانية. مع التصميم الحالي لـ indent، لا يمكن ضمان ذلك، ولم يتم اختباره على نطاق واسع.

برنامج indent لا يفهم لغة C. في بعض الحالات، يؤدي هذا إلى عدم القدرة على دمج الأسطر. النتيجة هي أن تمرير ملف عبر indent هو أمر غير قابل للعكس، حتى لو كان ملف المدخلات المستخدم هو نتيجة تشغيل indent بتشكيلة معينة (‘.indent.pro’).

بينما بُذلت محاولة لجعل indent يعمل مع C++، إلا أنه لن يؤدي عملاً جيدًا على أي مصدر C++ باستثناء الأبسط منها.

لا ينظر indent إلى خيار ‘--line-length’ المعطى عند كتابة التعليقات في ملف المخرجات. يؤدي هذا غالبًا إلى وضع التعليقات في أقصى اليمين. لمنع indent من دمج سطر مكسور يحتوي على تعليق في نهايته، تأكد من أن التعليقات تبدأ في السطر الأول من الكسر.

لا يحصي indent الأسطر والتعليقات (راجع خيار ‘-v’) عندما يتم إيقاف تشغيل indent باستخدام /* *INDENT-OFF* */.

التعليقات التي تأتي على شكل /*UPPERCASE*/ لا تُعامل كتعليق بل كمعرف، مما يؤدي إلى دمجها مع السطر التالي. هذا يجعل التعليقات من هذا النوع عديمة الفائدة، ما لم تكن مضمنة في الكود منذ البداية.

حقوق النسخ

ينطبق إشعار حقوق النشر التالي على برنامج indent. تظهر حقوق النشر وأذونات النسخ لهذا الدليل بالقرب من بداية ‘indent.texinfo’ و ‘indent.info’، وبالقرب من نهاية ‘indent.1’.

حقوق النسخ (c) 2015 Tim Hentenaar.
حقوق النسخ (c) 2001 David Ingamells.
حقوق النسخ (c) 1999 Carlo Wood.
حقوق النسخ (c) 1995, 1996 Joseph Arceneaux.
حقوق النسخ (c) 1989, 1992, 1993, 1994, 1995, 1996, 2014 مؤسسة البرمجيات الحرة
حقوق النسخ (c) 1985 Sun Microsystems, Inc.
حقوق النسخ (c) 1980 مجلس رقباء جامعة كاليفورنيا.
حقوق النسخ (c) 1976 مجلس أمناء جامعة إلينوي.
جميع الحقوق محفوظة.

يُسمح بإعادة التوزيع والاستخدام في أشكال المصدر والأشكال الثنائية
بشرط تكرار إشعار حقوق النشر أعلاه وهذه الفقرة في جميع هذه الأشكال
وأن تقر أي وثائق ومواد إعلانية ومواد أخرى تتعلق بهذا التوزيع
والاستخدام بأن البرنامج قد طُوّر بواسطة جامعة كاليفورنيا، بيركلي،
وجامعة إلينوي، أوربانا، وشركة صن ميكروسيستمز. لا يجوز استخدام اسم
أي من الجامعتين أو صن ميكروسيستمز لتأييد أو ترويج المنتجات المشتقة
من هذا البرنامج دون إذن كتابي مسبق محدد.
هذا البرنامج مقدم كما هو "AS IS" وبدون أي ضمانات صريحة أو ضمنية،
بما في ذلك، على سبيل المثال لا الحصر، الضمانات الضمنية لقابلية التسويق
والصلاحية لغرض معين.

مفتاح الخيارات المرجعي

فيما يلي قائمة بالخيارات مرتبة أبجديًا حسب الخيار الطويل، لمساعدتك في العثور على الخيار القصير المقابل.

--align-with-spaces                             -as
--blank-lines-after-commas                      -bc
--blank-lines-after-declarations                -bad
--blank-lines-after-procedures                  -bap
--blank-lines-before-block-comments             -bbb
--braces-after-if-line                          -bl
--braces-after-func-def-line                    -blf
--brace-indent                                  -bli
--braces-after-struct-decl-line                 -bls
--braces-on-if-line                             -br
--braces-on-func-def-line                       -brf
--braces-on-struct-decl-line                    -brs
--break-after-boolean-operator                  -nbbo
--break-before-boolean-operator                 -bbo
--break-function-decl-args                      -bfda
--break-function-decl-args-end                  -bfde
--case-indentation                              -clin
--case-brace-indentation                        -cbin
--comment-delimiters-on-blank-lines             -cdb
--comment-indentation                           -cn
--continuation-indentation                      -cin
--continue-at-parentheses                       -lp
--cuddle-do-while                               -cdw
--cuddle-else                                   -ce
--declaration-comment-column                    -cdn
--declaration-indentation                       -din
--dont-break-function-decl-args                 -nbfda
--dont-break-function-decl-args-end             -nbfde
--dont-break-procedure-type                     -npsl
--dont-cuddle-do-while                          -ncdw
--dont-cuddle-else                              -nce
--dont-format-comments                          -nfca
--dont-format-first-column-comments             -nfc1
--dont-line-up-parentheses                      -nlp
--dont-left-justify-declarations                -ndj
--dont-space-special-semicolon                  -nss
--dont-star-comments                            -nsc
--dont-tab-align-comments                       -ntac
--else-endif-column                             -cpn
--format-all-comments                           -fca
--format-first-column-comments                  -fc1
--gnu-style                                     -gnu
--honour-newlines                               -hnl
--ignore-newlines                               -nhnl
--ignore-profile                                -npro
--indent-label                                  -iln
--indent-level                                  -in
--k-and-r-style                                 -kr
--leave-optional-blank-lines                    -nsob
--leave-preprocessor-space                      -lps
--left-justify-declarations                     -dj
--line-comments-indentation                     -dn
--line-length                                   -ln
--linux-style                                   -linux
--no-blank-lines-after-commas                   -nbc
--no-blank-lines-after-declarations             -nbad
--no-blank-lines-after-procedures               -nbap
--no-blank-lines-before-block-comments          -nbbb
--no-comment-delimiters-on-blank-lines          -ncdb
--no-space-after-casts                          -ncs
--no-parameter-indentation                      -nip
--no-space-after-for				-nsaf
--no-space-after-function-call-names            -npcs
--no-space-after-if				-nsai
--no-space-after-parentheses                    -nprs
--no-space-after-while				-nsaw
--no-tabs                                       -nut
--no-verbosity                                  -nv
--original                                      -orig
--parameter-indentation                         -ipn
--paren-indentation                             -pin
--preserve-mtime				-pmt
--preprocessor-indentation                      -ppin
--procnames-start-lines                         -psl
--remove-preprocessor-space                     -nlps
--single-line-conditionals                      -slc
--space-after-cast                              -cs
--space-after-for				-saf
--space-after-if				-sai
--space-after-parentheses                       -prs
--space-after-procedure-calls                   -pcs
--space-after-while				-saw
--space-special-semicolon                       -ss
--spaces-around-initializers                    -sar
--standard-output                               -st
--start-left-side-of-comments                   -sc
--struct-brace-indentation                      -sbin
--swallow-optional-blank-lines                  -sob
--tab-size                                      -tsn
--use-tabs                                      -ut
--verbose                                       -v

قيمة الإرجاع

•   0 يعني عدم العثور على أخطاء أو تحذيرات خلال استدعاء ناجح للبرنامج.

•   يُعاد 2 إذا حدثت أخطاء أثناء التنسيق لا تمنع من إكماله، ولكن يبدو أنها تتجلى في كود غير صحيح (أي كود لن يترجم).

•   يُعاد 3 إذا توقف تنسيق ملف بسبب خطأ في الملف يمنع إكمال التنسيق. إذا حُدد أكثر من ملف دخل واحد، فسيستمر indent إلى الملف التالي.

•   يُعاد 4 في حال حدوث مشكلة داخلية خطيرة أدت لإنهاء عملية indent بالكامل، حتى لو لم تُعالج جميع الملفات المحددة.

•   يُعاد 64 إذا منعت مشكلة في الاستدعاء (مثل خيار غير صحيح) حدوث أي تنسيق.

الملفات
$HOME/.indent.pro	يحتوي الخيارات المبدئية لـ indent.

المؤلفون
تيم هينتينار
كارلو وود
جوزيف أرسينو
جيم كينغدون
ديفيد إنغاميلز

التاريخ
مشتق من برنامج "indent" التابع لـ UCB.

النسخ
حقوق النشر (C) لعام 1989، 1992، 1993، 1994، 1995، 1996، 2014، 2015 لمؤسسة البرمجيات الحرة، المحدودة. حقوق النشر (C) لعام 1995، 1996 لجوزيف أرسينو. حقوق النشر (C) لعام 1999 لكارلو وود. حقوق النشر (C) لعام 2001 لديفيد إنغاميلز. حقوق النشر (C) لعام 2013 لوكاش ستيلماخ. حقوق النشر (C) لعام 2015 لتيم هينتينار.

يُمنح الإذن لعمل وتوزيع نسخ حرفية من هذا الدليل بشرط الحفاظ على إشعار حقوق النشر وإشعار الإذن هذا في جميع النسخ.

ترجمة
تُرجمت هذه الصفحة من الدليل بواسطة زايد السعيدي <zayed.alsaidi@gmail.com>

هذه الترجمة هي وثيقة مجانية؛ راجع رخصة جنو العامة الإصدار 3 (https://www.gnu.org/licenses/gpl-3.0.html) أو ما بعده للاطلاع على شروط حقوق النشر. لا توجد أي ضمانات.

إذا وجدت أي أخطاء في ترجمة صفحة الدليل هذه، يرجى إرسال بريد إلكتروني إلى قائمة بريد المترجمين: kde-l10n-ar@kde.org.