Perltidy autoformat hashref как параметр

У меня есть следующий фрагмент кода:

my $obj = $class->new({ 
    schema    => $schema,
    reminder  => $reminder,
    action    => $action,
    dt        => $dt,     
});

Моя проблема в том, что perltidy пытается отформатировать его во что-то вроде этого:

my $obj = $class->new(
    {   schema   => $schema,
        reminder => $reminder,
        action   => $action,
        dt       => $dt,
    }
);

Мне не нравится размещение фигурных скобок. Можно ли как-то настроить perltidy для форматирования как в первом примере? (Пропуск форматирования блока невозможен. Я хочу форматировать каждый более длинный хеш-код в этот формат, чтобы он был более компактным и читабельным)

Мой perltidyrc до сих пор:

-l=79  # Max line width is 78 cols
-i=4   # Indent level is 4 cols
-ci=4  # Continuation indent is 4 cols
-st    # Output to STDOUT
-se    # Errors to STDERR
-vt=2  # Maximal vertical tightness
-cti=0 # No extra indentation for closing brackets
-pt=1  # Medium parenthesis tightness
-bt=1  # Medium brace tightness
-sbt=1 # Medium square bracket tightness
-bbt=1 # Medium block brace tightness
-nsfs  # No space before semicolons
-nolq  # Don't outdent long quoted strings

Если я удалю «{}» и передам параметры в виде списка, между прочим, это будет правильно. Но я должен пройти hashref.

Или вы могли бы порекомендовать разумный способ форматирования такого кода?


person Davs    schedule 04.01.2014    source источник


Ответы (2)


Следующее, кажется, решает вышеуказанную проблему и работает для меня:

# perltidy configuration file created Thu Sep 24 15:54:07 2015
# using: -

# I/O control
--standard-error-output                 # -se
--nostandard-output                     # -nst

# Basic formatting options
--indent-columns=4                      # -i=4  [=default]
--maximum-line-length=140               # -l=140

# Code indentation control
--closing-brace-indentation=0           # -cbi=0  [=default]
--closing-paren-indentation=0           # -cpi=0  [=default]
--closing-square-bracket-indentation=0  # -csbi=0  [=default]
--continuation-indentation=4            # -ci=4
--nooutdent-labels                      # -nola
--nooutdent-long-quotes                 # -nolq

# Whitespace control
--block-brace-tightness=1               # -bbt=1
--brace-tightness=1                     # -bt=1  [=default]
--paren-tightness=2                     # -pt=2
--nospace-for-semicolon                 # -nsfs
--square-bracket-tightness=1            # -sbt=1  [=default]
--square-bracket-vertical-tightness=0   # -sbvt=0  [=default]

# Comment controls
--ignore-side-comment-lengths           # -iscl
--minimum-space-to-comment=2            # -msc=2
--static-side-comment-prefix="#"        # -sscp="#"
--static-side-comments                  # -ssc

# Linebreak controls
--brace-vertical-tightness=0            # -bvt=0  [=default]
--paren-vertical-tightness=0            # -pvt=0  [=default]
--stack-closing-hash-brace              # -schb
--stack-closing-paren                   # -scp
--stack-closing-square-bracket          # -scsb
--stack-opening-hash-brace              # -sohb
--stack-opening-paren                   # -sop
--stack-opening-square-bracket          # -sosb
--want-break-before="% + - * / x != == >= <= =~ < > | & **= += *= &= <<= &&= -= /= |= + >>= ||= .= %= ^= x="  # -wbb="% + - * / x != == >= <= =~ < > | & **= += *= &= <<= &&= -= /= |= + >>= ||= .= %= ^= x="

# Blank line control
--noblanks-before-comments              # -nbbc
person nicomen    schedule 24.09.2015

Как насчет этого варианта?

perltidy  -lp -vt=2 -vtc=1

что дает

my $obj = $class->new( { schema   => $schema,
                         reminder => $reminder,
                         action   => $action,
                         dt       => $dt,
                       } );

который находится здесь http://perltidy.sourceforge.net/perltidy.html#line_break_control.

Закрывающие токены (кроме фигурных скобок) управляются -vtc=n или --vertical-tightness-closing=n, где

-vtc=0 всегда разрывать строку перед закрывающим токеном (по умолчанию), -vtc=1 не разрывать перед закрывающим токеном, за которым следует точка с запятой или другой закрывающий токен, и не в среде списка. -vtc=2 никогда не прерываться перед токеном закрытия.

РЕДАКТИРОВАТЬ Я подозреваю, что вам не хватало параметра -lp (параметры выравнивания), который также необходим для вертикальной герметичности (-vt и -vtc)

person KeepCalmAndCarryOn    schedule 05.01.2014
comment
Ну а пока ничего лучше не придумается, так и придется делать. Спасибо. - person Davs; 05.01.2014