Whitespace и редактори

  1. Някои от вас имат проблеми с whitespace, бил той този на края на реда или идентацията. Това ще рече, че не знаете как да си ползвате редактора добре. Няма значение дали ползвате Vim или Notepad++ - това е важно умение. Повечето проекти (и почти всички open source такива) имат стриктни конвенции. Ако очаквате да работите в адекватен екип, трябва да се научите да се съобразявате с тях. Whitespace-а е първото нещо.

    Искам да напиша няколко неща, които ще са ви полезни за спазването на критериите ни. Отделно, ще се радвам ако някой от вас добави по нещо.

    Идентацията ви не се променя когато правите copy paste. Ако сте предали код с табове, файла на вашия компютър също има табове - просто не го осъзнавате. На сайта табовете се равняват на осем интервала. В вашия редактор могат да се показват като по-малко, което обяснява разликата. За сметка на това, интервалите навсякъде изглеждат по един и същи начин. Отделно, не е нужно да натискате клавиша <Tab> за да има табулации в кода ви. Например, когато натиснете <Enter>, редактора може да реши да ви идентира с табове, а не интервали. Повечето редактори имат възможност да показват невидими символи (интервали, табове и нов ред). Намерете тази опция и я включете. Ще добиете по-добра представа как работи вашия редактор.

    Повечето редактори имат опция за триене на trailing whitespace. Дори да не го правят автоматично, трябва да има команда, която го прави. Например Vim го прави автоматично със стандартните настройки, а в TextMate има команда. Открийте как става във вашия редактор и го ползвайте. Това може да се окаже най-голям проблем при празните редове, където редактора ви ще остави серия от интервали/табове преди новия ред. Открийте как да ги изтриете. Неприемливо е да махнете всички празни редове.

    Ако някой от вас е минал през това и иска да сподели как си е конфигурирал редактора, моля да го направи в тази тема. Ползвате общо пет-шест редактора, така че несъмнено ще е полезно и за други. Ще има и съответното възнаграждение.

  2. В Notepad++ нещата с trailing whitespace-а са ясни - меню Макроси, опция Trim Trailing and save. Същото се постига с Alt+Shift+Save - около 7.4 пъти по-бързо :smirk:

    За идентацията - меню Настройки -> Настройки -> tab Меню Езици: вдясно виждате Настройки на отместването. Избира се ширина 2 и се слага отметката пред "Замени с интервали". Алтернатива на последното изречение е в дясното падащото меню от споменатия tab Меню Езици да бъде избран език ruby, като се използват настройките по подразбиране за него (при мен това също работи добре, но аз лично съм почитател на ръчното конфигуриране).

  3. Ето го и първия коментар относно Notepad++ (поправка явно не е пъврия) :smile: - имате няколко неща, които можете да използвате:

    1. Имате команда Macro -> Trim Trailing and save или просто Alt+Shift+S. Точно под нея е Modify Shortcut, така че можете да си я смените на Ctrl+S или Ctrl+Shift+S примерно, ако ви е по-удобно
    2. Notepad++ има възможност да бъде конфигуриран да работи с интервали вместо табове за които езици искате тоест накратко можете просто да направите tab да идентира два спейса и shift+tab да връща два спейса. Настройката става чрез Settings -> Preferences... -> Language Menu/Tab Settings -> избирате ruby, uncheck-вате use default, давате tab size : 2 и replace by space

    Въпреки всичко обаче при новите редове преди def лесно може да се получи trailing whitespace. Има и още една команда, която го премахва, ако по някаква причина не ви е харесала първата Edit -> Blank Operations -> Trim Trailing space. Ако искате да и сложите shortcut тогава имате Settings -> Shortcut Mapper -> #27

    Иначе ето и едно cross-editor решение за trailing whitespace-a - предполагам почти навсякъде при replace-а има regex support - Ctrl+H или Ctrl+R и сменяте [ \t]+$ с празен string - сигурно на доста редактори бихте могли и да си направите макро, което да го прави вместо вас и да му сложите shortcut, правейки живота ви и точките ви в руби курса по-щастливи :innocent:

    Аналогично можете да си направите и макро за \t и два интервала. :smile_cat:

  4. За тези, които ползват Sublime Text 2:

    1. Триене на trailing whitespaces при save: Preferences -> Settings - Default -> търсите trim_trailing_white_space_on_save -> set-вате го на true и запазвате файла със сетингите

    2. Показване на trailing whitespaces и shortcut за триене: https://github.com/SublimeText/TrailingSpaces

    Edit: късно видях, че вече е писано за него

  5. @Станислав и всички други, които ползват Sublime Text 2 — не е препоръчително да редактирате файловете, които са ... - Default, например Settings - Default. Редактирате тези които са ... - User, тъй като default файловете биват презаписани при всяко обновяване на редактора. Default-файловете може да ползвате само за референция, например за да видите какъв е ключът за дадена опция и да си го копирате и промените в user-файла.

    Ето тук може да намерите един пакет от няколко добри филмчета по темата Sublime Text 2 и как да ползвате възможностите на този редактор по-оптимално.

  6. В Emacs оцветяването на trailing whitespace се включва с (setq-default show-trailing-whitespace t) Изтрива се M-x delete-trailing-whitespace. Мен ме мързи да пиша такива работи и съм си го map-нал по следния начин : (global-set-key (kbd "C-x t") 'delete-trailing-whitespace) Би трябвало да има начин да става автоматично с някакъв hook, но още сънувам кошмари на elisp :fearful:.

    И 2те неща съм си ги добавил в .emacs, но с чиста съвест могат да се изпълнят през *scratch* буфера с M-x eval-buffer (съвсем отделна тема е защо бихте искали да го направите :neutral_face:).

  7. Още нещо полезно в Sublime Text 2, или две празни места с табулация само за Ruby:

    1. Отворете файл с ruby синтаксис.
    2. Preferences-> Settings-More-> Syntax Specific-User
    3. Напишете/копирайте:

       {
         "tab_size": 2,
         "translate_tabs_to_spaces": true
       }
      
    4. Ctrl + S

    Enjoy :wink:

  8. Частта от .emacs файла ми, която се грижи trailing whitespace, табове и празна последна линия да ми бъркат в очите:

    (require 'whitespace)
    (global-whitespace-mode 1)
    
    (custom-set-variables
     ;; Пропуснати промеливи...
     '(whitespace-style (quote (tabs face trailing empty tab-mark))))
    

    Това работи прекрасно с fill-column-indicator (изчертава вертикална линия на 80-а колона), който се активира глобално така:

    (require 'fill-column-indicator)
    (define-globalized-minor-mode global-fci-mode fci-mode (lambda () (fci-mode 1)))
    (global-fci-mode 1)
    

Трябва да сте влезли в системата, за да може да отговаряте на теми.