Comments 20
Ну встроили вы препроцессор в текстовый редактор. И как потом редактировать эту сгенерированную стену кода?
0
Для более простых случаев плагин, конечно, будет как пушкой по воробьям. Часто достаточно завести N курсоров и набрать/отредактировать текст от руки один раз. Multiple Cursors — наверное, моя самая любимая фича в Sublime Text :)
+2
Используя Multiple Cursors можно набрать одинаковый текст в множество строк, но так не получится добавить к каждой строке свои значения полей.
0
Верно, но на то они и свои значения :)
Ваше решение естественно имеет право на жизнь, но очевидно, что оно годится только для одной конкретной задачи. Для другой задачи, где у вас будет, например, два плейсхолдера, а не четыре, придётся плагин переписывать. А раз всё равно переписывать, то оставшиеся уникальные куски текста, думаю, можно написать и от руки.
Ваше решение естественно имеет право на жизнь, но очевидно, что оно годится только для одной конкретной задачи. Для другой задачи, где у вас будет, например, два плейсхолдера, а не четыре, придётся плагин переписывать. А раз всё равно переписывать, то оставшиеся уникальные куски текста, думаю, можно написать и от руки.
0
Есть плагин Emmet от Zen-coding, например если вы введете
То получите всю структуру из первой таблицы.
(tr>(td.fls>GEN:FIELDLABEL[name="FieldLabel$"])(td.dfs[style="white-space:nowrap;"]>GEN:FIELDVALUE[NAME="Field$"]))*10
То получите всю структуру из первой таблицы.
0
Ммм, это не совсем так.
Если вам нужны только эти значения — выделите все строки и скопируйте их в буфер обмена. Далее просто наберите что хотите, и вставляйте ваши значения. ST вставит скопированные значения построчно. Вот только что из столбика цифр 1,2,3,4,5,6 сделал то же что и у вас, используя этот прием.:
Для сложных примеров наверное так не получится, но для простых вещей работает прекрасно.
Если вам нужны только эти значения — выделите все строки и скопируйте их в буфер обмена. Далее просто наберите что хотите, и вставляйте ваши значения. ST вставит скопированные значения построчно. Вот только что из столбика цифр 1,2,3,4,5,6 сделал то же что и у вас, используя этот прием.:
<Tag link="1" name="1" />
<Tag link="2" name="2" />
<Tag link="3" name="3" />
<Tag link="4" name="4" />
<Tag link="5" name="5" />
<Tag link="6" name="6" />
Для сложных примеров наверное так не получится, но для простых вещей работает прекрасно.
+1
Так это и есть почти ручной копипаст от которого я хотел избавится. На видео — Вы копируете 4 раза шаблон, выделяете 4 плейсхолдера, идете на другую вкладку, копируете 4 значения, идете обратно, вставляете.
Если надо скопировать 30 раз? И главное если массив значений не одна колонка, а двумерный массив?
Сделал видео со своим вариантом:
Если надо скопировать 30 раз? И главное если массив значений не одна колонка, а двумерный массив?
Сделал видео со своим вариантом:
0
> Хорошо если полей 3, а если их 30 и кусков кода тоже не один десяток?
Я тоже когда-то делал подобное, но только с помощью Excel. Но потом мне это показалось бредом и я изучил массивы и циклы.
Не проще ли это сгенерировать из js?
А в случае с кодом — эта операция вообще не имеет смысла, почему — я уже написал.
Я тоже когда-то делал подобное, но только с помощью Excel. Но потом мне это показалось бредом и я изучил массивы и циклы.
Не проще ли это сгенерировать из js?
А в случае с кодом — эта операция вообще не имеет смысла, почему — я уже написал.
+3
Отвечу всем сразу, мне нравится использовать в работе именно sublime text 2 и хотелось сделать свой рабочий инструмент чуточку удобнее и функциональнее.
Выше советуют использовать js, excel, zencoding, emmet… меня устраивала и реализация в mssql, но это все равно лишние прыжки между окнами. А теперь я могу используя Find in Files в Sublime Text найти все вхождения например field1 во все файлы проекта и быстро добавить код для пары десятков новых полей заменив field1 на {0} и нажав Ctrl+Shift+Z не выходя из текстового редактора. Т.е. речь не столько о написании кода с нуля, а о возможности быстрого изменения. Может несколько сумбурно описал, но это моя первая статья.
Выше советуют использовать js, excel, zencoding, emmet… меня устраивала и реализация в mssql, но это все равно лишние прыжки между окнами. А теперь я могу используя Find in Files в Sublime Text найти все вхождения например field1 во все файлы проекта и быстро добавить код для пары десятков новых полей заменив field1 на {0} и нажав Ctrl+Shift+Z не выходя из текстового редактора. Т.е. речь не столько о написании кода с нуля, а о возможности быстрого изменения. Может несколько сумбурно описал, но это моя первая статья.
0
emmet это плугин в сублиметекст.
-2
Почитал про emmet, но не понял в вышепрведеном Вами примере откуда возьмется набор значений для подстановки вместо Field$?
+1
Так речь не только о генерации html разметки. Вот еще реальный пример использования чтобы оценить объем копипастинга:
Промахнулся с ответом на последний комментарий m1el
Исходник
#region "Value Formatting"
private void FormatValues()
{
try
{
DbUtils.StartTransaction();
EmdCreeksAndOtherDamsSampleRecord rec = this.GetRecord();
// format {0}
this.{0}.Text = CommonHelper.ComposeValue(rec, EmdCreeksAndOtherDamsSampleTable.{0}, EmdCreeksAndOtherDamsSampleTable.{1});
}
catch
{
DbUtils.RollBackTransaction();
}
finally
{
DbUtils.EndTransaction();
}
}
#endregion
#region "DataBind"
// Populate the UI controls using the DataSource. To customize, override this method in EmdCreeksAndOtherDamsSampleTableControlRow.
public override void DataBind()
{
base.DataBind();
// Make sure that the DataSource is initialized.
if (this.DataSource == null)
{
return;
}
// For each field, check to see if a value is specified. If a value is specified,
// then format the value for display. If no value is specified, use the default value (formatted).
if (this.DataSource.{0}Specified)
{
string formattedValue = HttpUtility.HtmlEncode(this.DataSource.Format(EmdCreeksAndOtherDamsSampleTable.{0}));
if (formattedValue != null)
{
if (formattedValue.Length > (int)(100))
{
formattedValue = NetUtils.EncodeStringForHtmlDisplay(formattedValue.Substring(0, 100));
formattedValue = formattedValue + "...";
}
}
this.{0}.Text = formattedValue;
}
else
{
this.{0}.Text = EmdCreeksAndOtherDamsSampleTable.{0}.Format(EmdCreeksAndOtherDamsSampleTable.{0}.DefaultValue);
}
if (this.{0}.Text == null ||
this.{0}.Text.Trim().Length == 0)
{
this.{0}.Text = " ";
}
}
#endregion
Выделяем оба шаблона, жмем ctrl+shift+z, получаем готовый кусок кода
#region "Value Formatting"
private void FormatValues()
{
try
{
DbUtils.StartTransaction();
EmdCreeksAndOtherDamsSampleRecord rec = this.GetRecord();
// format pH
this.pH.Text = CommonHelper.ComposeValue(rec, EmdCreeksAndOtherDamsSampleTable.pH, EmdCreeksAndOtherDamsSampleTable.pHSign);
// format EC
this.EC.Text = CommonHelper.ComposeValue(rec, EmdCreeksAndOtherDamsSampleTable.EC, EmdCreeksAndOtherDamsSampleTable.ECSign);
// format WaterTemp
this.WaterTemp.Text = CommonHelper.ComposeValue(rec, EmdCreeksAndOtherDamsSampleTable.WaterTemp, EmdCreeksAndOtherDamsSampleTable.WaterTempSign);
// format TDS
this.TDS.Text = CommonHelper.ComposeValue(rec, EmdCreeksAndOtherDamsSampleTable.TDS, EmdCreeksAndOtherDamsSampleTable.TDSSign);
// format Turbidity
this.Turbidity.Text = CommonHelper.ComposeValue(rec, EmdCreeksAndOtherDamsSampleTable.Turbidity, EmdCreeksAndOtherDamsSampleTable.TurbiditySign);
// format TSS
this.TSS.Text = CommonHelper.ComposeValue(rec, EmdCreeksAndOtherDamsSampleTable.TSS, EmdCreeksAndOtherDamsSampleTable.TSSSign);
// format Fluoride
this.Fluoride.Text = CommonHelper.ComposeValue(rec, EmdCreeksAndOtherDamsSampleTable.Fluoride, EmdCreeksAndOtherDamsSampleTable.FluorideSign);
// format Chloride
this.Chloride.Text = CommonHelper.ComposeValue(rec, EmdCreeksAndOtherDamsSampleTable.Chloride, EmdCreeksAndOtherDamsSampleTable.ChlorideSign);
// format SO4
this.SO4.Text = CommonHelper.ComposeValue(rec, EmdCreeksAndOtherDamsSampleTable.SO4, EmdCreeksAndOtherDamsSampleTable.SO4Sign);
// format Nitrate
this.Nitrate.Text = CommonHelper.ComposeValue(rec, EmdCreeksAndOtherDamsSampleTable.Nitrate, EmdCreeksAndOtherDamsSampleTable.NitrateSign);
// format Nitrite
this.Nitrite.Text = CommonHelper.ComposeValue(rec, EmdCreeksAndOtherDamsSampleTable.Nitrite, EmdCreeksAndOtherDamsSampleTable.NitriteSign);
// format OilAndGrease
this.OilAndGrease.Text = CommonHelper.ComposeValue(rec, EmdCreeksAndOtherDamsSampleTable.OilAndGrease, EmdCreeksAndOtherDamsSampleTable.OilAndGreaseSign);
}
catch
{
DbUtils.RollBackTransaction();
}
finally
{
DbUtils.EndTransaction();
}
}
#endregion
#region "DataBind"
// Populate the UI controls using the DataSource. To customize, override this method in EmdCreeksAndOtherDamsSampleTableControlRow.
public override void DataBind()
{
base.DataBind();
// Make sure that the DataSource is initialized.
if (this.DataSource == null)
{
return;
}
// For each field, check to see if a value is specified. If a value is specified,
// then format the value for display. If no value is specified, use the default value (formatted).
if (this.DataSource.pHSpecified)
{
string formattedValue = HttpUtility.HtmlEncode(this.DataSource.Format(EmdCreeksAndOtherDamsSampleTable.pH));
if (formattedValue != null)
{
if (formattedValue.Length > (int)(100))
{
formattedValue = NetUtils.EncodeStringForHtmlDisplay(formattedValue.Substring(0, 100));
formattedValue = formattedValue + "...";
}
}
this.pH.Text = formattedValue;
}
else
{
this.pH.Text = EmdCreeksAndOtherDamsSampleTable.pH.Format(EmdCreeksAndOtherDamsSampleTable.pH.DefaultValue);
}
if (this.pH.Text == null ||
this.pH.Text.Trim().Length == 0)
{
this.pH.Text = " ";
}
if (this.DataSource.ECSpecified)
{
string formattedValue = HttpUtility.HtmlEncode(this.DataSource.Format(EmdCreeksAndOtherDamsSampleTable.EC));
if (formattedValue != null)
{
if (formattedValue.Length > (int)(100))
{
formattedValue = NetUtils.EncodeStringForHtmlDisplay(formattedValue.Substring(0, 100));
formattedValue = formattedValue + "...";
}
}
this.EC.Text = formattedValue;
}
else
{
this.EC.Text = EmdCreeksAndOtherDamsSampleTable.EC.Format(EmdCreeksAndOtherDamsSampleTable.EC.DefaultValue);
}
if (this.EC.Text == null ||
this.EC.Text.Trim().Length == 0)
{
this.EC.Text = " ";
}
if (this.DataSource.WaterTempSpecified)
{
string formattedValue = HttpUtility.HtmlEncode(this.DataSource.Format(EmdCreeksAndOtherDamsSampleTable.WaterTemp));
if (formattedValue != null)
{
if (formattedValue.Length > (int)(100))
{
formattedValue = NetUtils.EncodeStringForHtmlDisplay(formattedValue.Substring(0, 100));
formattedValue = formattedValue + "...";
}
}
this.WaterTemp.Text = formattedValue;
}
else
{
this.WaterTemp.Text = EmdCreeksAndOtherDamsSampleTable.WaterTemp.Format(EmdCreeksAndOtherDamsSampleTable.WaterTemp.DefaultValue);
}
if (this.WaterTemp.Text == null ||
this.WaterTemp.Text.Trim().Length == 0)
{
this.WaterTemp.Text = " ";
}
if (this.DataSource.TDSSpecified)
{
string formattedValue = HttpUtility.HtmlEncode(this.DataSource.Format(EmdCreeksAndOtherDamsSampleTable.TDS));
if (formattedValue != null)
{
if (formattedValue.Length > (int)(100))
{
formattedValue = NetUtils.EncodeStringForHtmlDisplay(formattedValue.Substring(0, 100));
formattedValue = formattedValue + "...";
}
}
this.TDS.Text = formattedValue;
}
else
{
this.TDS.Text = EmdCreeksAndOtherDamsSampleTable.TDS.Format(EmdCreeksAndOtherDamsSampleTable.TDS.DefaultValue);
}
if (this.TDS.Text == null ||
this.TDS.Text.Trim().Length == 0)
{
this.TDS.Text = " ";
}
if (this.DataSource.TurbiditySpecified)
{
string formattedValue = HttpUtility.HtmlEncode(this.DataSource.Format(EmdCreeksAndOtherDamsSampleTable.Turbidity));
if (formattedValue != null)
{
if (formattedValue.Length > (int)(100))
{
formattedValue = NetUtils.EncodeStringForHtmlDisplay(formattedValue.Substring(0, 100));
formattedValue = formattedValue + "...";
}
}
this.Turbidity.Text = formattedValue;
}
else
{
this.Turbidity.Text = EmdCreeksAndOtherDamsSampleTable.Turbidity.Format(EmdCreeksAndOtherDamsSampleTable.Turbidity.DefaultValue);
}
if (this.Turbidity.Text == null ||
this.Turbidity.Text.Trim().Length == 0)
{
this.Turbidity.Text = " ";
}
if (this.DataSource.TSSSpecified)
{
string formattedValue = HttpUtility.HtmlEncode(this.DataSource.Format(EmdCreeksAndOtherDamsSampleTable.TSS));
if (formattedValue != null)
{
if (formattedValue.Length > (int)(100))
{
formattedValue = NetUtils.EncodeStringForHtmlDisplay(formattedValue.Substring(0, 100));
formattedValue = formattedValue + "...";
}
}
this.TSS.Text = formattedValue;
}
else
{
this.TSS.Text = EmdCreeksAndOtherDamsSampleTable.TSS.Format(EmdCreeksAndOtherDamsSampleTable.TSS.DefaultValue);
}
if (this.TSS.Text == null ||
this.TSS.Text.Trim().Length == 0)
{
this.TSS.Text = " ";
}
if (this.DataSource.FluorideSpecified)
{
string formattedValue = HttpUtility.HtmlEncode(this.DataSource.Format(EmdCreeksAndOtherDamsSampleTable.Fluoride));
if (formattedValue != null)
{
if (formattedValue.Length > (int)(100))
{
formattedValue = NetUtils.EncodeStringForHtmlDisplay(formattedValue.Substring(0, 100));
formattedValue = formattedValue + "...";
}
}
this.Fluoride.Text = formattedValue;
}
else
{
this.Fluoride.Text = EmdCreeksAndOtherDamsSampleTable.Fluoride.Format(EmdCreeksAndOtherDamsSampleTable.Fluoride.DefaultValue);
}
if (this.Fluoride.Text == null ||
this.Fluoride.Text.Trim().Length == 0)
{
this.Fluoride.Text = " ";
}
if (this.DataSource.ChlorideSpecified)
{
string formattedValue = HttpUtility.HtmlEncode(this.DataSource.Format(EmdCreeksAndOtherDamsSampleTable.Chloride));
if (formattedValue != null)
{
if (formattedValue.Length > (int)(100))
{
formattedValue = NetUtils.EncodeStringForHtmlDisplay(formattedValue.Substring(0, 100));
formattedValue = formattedValue + "...";
}
}
this.Chloride.Text = formattedValue;
}
else
{
this.Chloride.Text = EmdCreeksAndOtherDamsSampleTable.Chloride.Format(EmdCreeksAndOtherDamsSampleTable.Chloride.DefaultValue);
}
if (this.Chloride.Text == null ||
this.Chloride.Text.Trim().Length == 0)
{
this.Chloride.Text = " ";
}
if (this.DataSource.SO4Specified)
{
string formattedValue = HttpUtility.HtmlEncode(this.DataSource.Format(EmdCreeksAndOtherDamsSampleTable.SO4));
if (formattedValue != null)
{
if (formattedValue.Length > (int)(100))
{
formattedValue = NetUtils.EncodeStringForHtmlDisplay(formattedValue.Substring(0, 100));
formattedValue = formattedValue + "...";
}
}
this.SO4.Text = formattedValue;
}
else
{
this.SO4.Text = EmdCreeksAndOtherDamsSampleTable.SO4.Format(EmdCreeksAndOtherDamsSampleTable.SO4.DefaultValue);
}
if (this.SO4.Text == null ||
this.SO4.Text.Trim().Length == 0)
{
this.SO4.Text = " ";
}
if (this.DataSource.NitrateSpecified)
{
string formattedValue = HttpUtility.HtmlEncode(this.DataSource.Format(EmdCreeksAndOtherDamsSampleTable.Nitrate));
if (formattedValue != null)
{
if (formattedValue.Length > (int)(100))
{
formattedValue = NetUtils.EncodeStringForHtmlDisplay(formattedValue.Substring(0, 100));
formattedValue = formattedValue + "...";
}
}
this.Nitrate.Text = formattedValue;
}
else
{
this.Nitrate.Text = EmdCreeksAndOtherDamsSampleTable.Nitrate.Format(EmdCreeksAndOtherDamsSampleTable.Nitrate.DefaultValue);
}
if (this.Nitrate.Text == null ||
this.Nitrate.Text.Trim().Length == 0)
{
this.Nitrate.Text = " ";
}
if (this.DataSource.NitriteSpecified)
{
string formattedValue = HttpUtility.HtmlEncode(this.DataSource.Format(EmdCreeksAndOtherDamsSampleTable.Nitrite));
if (formattedValue != null)
{
if (formattedValue.Length > (int)(100))
{
formattedValue = NetUtils.EncodeStringForHtmlDisplay(formattedValue.Substring(0, 100));
formattedValue = formattedValue + "...";
}
}
this.Nitrite.Text = formattedValue;
}
else
{
this.Nitrite.Text = EmdCreeksAndOtherDamsSampleTable.Nitrite.Format(EmdCreeksAndOtherDamsSampleTable.Nitrite.DefaultValue);
}
if (this.Nitrite.Text == null ||
this.Nitrite.Text.Trim().Length == 0)
{
this.Nitrite.Text = " ";
}
if (this.DataSource.OilAndGreaseSpecified)
{
string formattedValue = HttpUtility.HtmlEncode(this.DataSource.Format(EmdCreeksAndOtherDamsSampleTable.OilAndGrease));
if (formattedValue != null)
{
if (formattedValue.Length > (int)(100))
{
formattedValue = NetUtils.EncodeStringForHtmlDisplay(formattedValue.Substring(0, 100));
formattedValue = formattedValue + "...";
}
}
this.OilAndGrease.Text = formattedValue;
}
else
{
this.OilAndGrease.Text = EmdCreeksAndOtherDamsSampleTable.OilAndGrease.Format(EmdCreeksAndOtherDamsSampleTable.OilAndGrease.DefaultValue);
}
if (this.OilAndGrease.Text == null ||
this.OilAndGrease.Text.Trim().Length == 0)
{
this.OilAndGrease.Text = " ";
}
}
#endregion
Промахнулся с ответом на последний комментарий m1el
0
О чём я говорил вам выше — откуда вы возьмёте список значений, которыми нужно закопипастить плэисхолдер
{0}
? Вам нужно отредактировать плагин. Плюс в данном конкретном случае проблема не в копипасте, а в архитектуре приложения: в идеале в каждом из методов вместо однообразной портянки должен быть цикл.+1
Sign up to leave a comment.
Генерация повторяющихся блоков кода с помощью плагина для Sublime Text 2