Здравствуйте, Codealot, Вы писали:
C>Например, простая и полезная фича — сделать опцию, чтобы числа в VS показывались с сепараторами тысяч. Запрос на фичу добавили давно, но как обычно, разрабы не будут ничего делать, пока пользователи не прорвут им новую дырку в заднице.
Вариант сделать самому не рассматривается?
А разрабам это просто не нужно. В коде редко когда встречаются литералы чисел. Плюс можно прямо в литерале задать разделители пробелами:
var x = 123_456_789;
В новых версиях Шарпа это работает. Так что оно просо не стоит выделки.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re: А почему бы нам не сделать что-нибудь полезное?
Здравствуйте, Codealot, Вы писали:
C>Например, простая и полезная фича — сделать опцию, чтобы числа в VS показывались с сепараторами тысяч. Запрос на фичу добавили давно, но как обычно, разрабы не будут ничего делать, пока пользователи не прорвут им новую дырку в заднице.
Попросил ДипСика:
Напиши плагин к VS 2022 реализующий отображение в коде чисел с разделителями тысяч.
Он выдал готовый код плагина. Остается только добавить во VSIX-проект, скомпилировать и проинсталлировать плагин. Пробуй, если интересно.
using Microsoft.VisualStudio.Text;
using Microsoft.VisualStudio.Text.Editor;
using Microsoft.VisualStudio.Text.Operations;
using System;
using System.Text.RegularExpressions;
namespace ThousandsSeparatorExtension
{
[Export(typeof(IWpfTextViewCreationListener))]
[ContentType("CSharp")]
[ContentType("Basic")]
[TextViewRole(PredefinedTextViewRoles.Document)]
public sealed class NumberAdornment : IWpfTextViewCreationListener
{
[Import]
public ITextUndoHistoryRegistry UndoHistoryRegistry { get; set; }
[Import]
public ITextBufferFactoryService TextBufferFactoryService { get; set; }
public void TextViewCreated(IWpfTextView textView)
{
textView.TextBuffer.Changed += OnTextBufferChanged;
}
private void OnTextBufferChanged(object sender, TextContentChangedEventArgs e)
{
if (e.Changes.Count == 0) return;
var buffer = sender as ITextBuffer;
if (buffer.Properties.TryGetProperty("IsProcessing", out bool isProcessing) && isProcessing)
return;
buffer.Properties["IsProcessing"] = true;
using (ITextEdit edit = buffer.CreateEdit())
{
foreach (var change in e.Changes)
{
var line = buffer.CurrentSnapshot.GetLineFromPosition(change.NewPosition);
string text = line.GetText();
foreach (Match match in Regex.Matches(text, @"\b\d{4,}\b"))
{
string formatted = FormatNumber(match.Value);
if (formatted != match.Value)
{
Span span = new Span(line.Start.Position + match.Index, match.Length);
edit.Replace(span, formatted);
}
}
}
if (edit.HasEffectiveChanges)
{
edit.Apply();
}
}
buffer.Properties["IsProcessing"] = false;
}
private string FormatNumber(string number)
{
int cursor = number.Length - 1;
var result = new System.Collections.Generic.Stack<char>();
int count = 0;
while (cursor >= 0)
{
result.Push(number[cursor]);
count++;
if (count % 3 == 0 && cursor > 0)
result.Push('_');
cursor--;
}
return new string(result.ToArray()).Trim('_');
}
}
}
Попросил его сгенерить и source.extension.vsixmanifest (единственная более менее сложная часть проекта):
Здравствуйте, VladD2, Вы писали:
VD>Попросил ДипСика: VD>
VD>Напиши плагин к VS 2022 реализующий отображение в коде чисел с разделителями тысяч.
Этот незамутненный ни малейшим пониманием оптимизм...
Ты в курсе, что такое Watch в отладчике и зачем оно используется? И какое отношение к нему имеет отображение в коде, по твоему? Если допустить что оно вообще будет работать, в чем я сильно сомневаюсь.
... << RSDN@Home 1.0.0 alpha 5 rev. 0>>
Ад пуст, все бесы здесь.
Re[3]: А почему бы нам не сделать что-нибудь полезное?
Здравствуйте, Codealot, Вы писали:
C>Здравствуйте, VladD2, Вы писали:
VD>>Попросил ДипСика: VD>>
VD>>Напиши плагин к VS 2022 реализующий отображение в коде чисел с разделителями тысяч.
C>Этот незамутненный ни малейшим пониманием оптимизм... C>Ты в курсе, что такое Watch в отладчике и зачем оно используется? И какое отношение к нему имеет отображение в коде, по твоему? Если допустить что оно вообще будет работать, в чем я сильно сомневаюсь.
Под рукой нет студии, но ChatGPT предлагает готовый код.
Попробуйте:
using Microsoft.VisualStudio.DebuggerVisualizers;
using System;
using System.Diagnostics;
using System.Globalization;
using System.IO;
using System.Windows.Forms;
[assembly: DebuggerVisualizer(
typeof(WatchNumberVisualizer),
typeof(VisualizerObjectSource),
Target = typeof(int),
Description = "Formatted Number Visualizer")]
[assembly: DebuggerVisualizer(
typeof(WatchNumberVisualizer),
typeof(VisualizerObjectSource),
Target = typeof(long),
Description = "Formatted Number Visualizer")]
[assembly: DebuggerVisualizer(
typeof(WatchNumberVisualizer),
typeof(VisualizerObjectSource),
Target = typeof(double),
Description = "Formatted Number Visualizer")]
public class WatchNumberVisualizer : DialogDebuggerVisualizer
{
protected override void Show(IDialogVisualizerService windowService, IVisualizerObjectProvider objectProvider)
{
object data = objectProvider.GetObject();
string formattedValue = FormatWithSpaces(data);
MessageBox.Show($"Formatted Value:\n{formattedValue}", "Formatted Number Visualizer");
}
private string FormatWithSpaces(object number)
{
if (number is int i)
return i.ToString("N0", CultureInfo.InvariantCulture).Replace(',', ' ');
if (number is long l)
return l.ToString("N0", CultureInfo.InvariantCulture).Replace(',', ' ');
if (number is double d)
return d.ToString("N2", CultureInfo.InvariantCulture).Replace(',', ' ');
return number.ToString();
}
}
Здравствуйте, Codealot, Вы писали:
C>Этот незамутненный ни малейшим пониманием оптимизм...
Звучит как хамство. Давай по уважительнее и по аккуратнее.
C>Ты в курсе, что такое Watch в отладчике и зачем оно используется? И какое отношение к нему имеет отображение в коде, по твоему? Если допустить что оно вообще будет работать, в чем я сильно сомневаюсь.
Из твоего описания ни разу не ясно, что речь идет об отладчике. Ты тогда бы уточнял, что хочешь.
С представлением данных в отладчике все еще проще. Любое значение можно всегда в строку с нужным форматом преобразовать.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[4]: А почему бы нам не сделать что-нибудь полезное?
Здравствуйте, VladD2, Вы писали:
VD>Из твоего описания ни разу не ясно, что речь идет об отладчике. Ты тогда бы уточнял, что хочешь.
В тикете про это буквально написано
Ну а твое предположение что это должно было быть просто странное.
VD>С представлением данных в отладчике все еще проще. Любое значение можно всегда в строку с нужным форматом преобразовать.
Кхм, как ты это себе представляешь?
... << RSDN@Home 1.0.0 alpha 5 rev. 0>>
Ад пуст, все бесы здесь.
Re: А почему бы нам не сделать что-нибудь полезное?
Пробежался по ссылкам и не уловил, почему DebuggerDisplayAttribute на подходит? На SO и ссылка на использование есть. Да, не из коробки, но если очень надо — один раз добавил на уровне отладчика и пользуйся.
Re[2]: А почему бы нам не сделать что-нибудь полезное?
Здравствуйте, Codealot, Вы писали:
_>>один раз добавил на уровне отладчика и пользуйся.
C>Как ты это себе представляешь?
По ссылке которую я привёл упоминается файл autoexp.cs, находится он где-то тут: Microsoft Visual Studio\2019\Enterprise\Common7\Packages\Debugger\Visualizers\Original\autoexp.cs .
Добавляешь, напр. в конец, нужный тебе DebuggerDisplay уровня assembly:
[assembly: DebuggerDisplay("{m_value.ToString(\"N0\", new System.Globalization.CultureInfo(\"en-US\", false) {NumberFormat = new System.Globalization.NumberFormatInfo() {NumberGroupSeparator = \"_\"}}),nq}", Target = typeof(Int32))]
[assembly: DebuggerDisplay("{m_value.ToString(\"N0\", new System.Globalization.CultureInfo(\"en-US\", false) {NumberFormat = new System.Globalization.NumberFormatInfo() {NumberGroupSeparator = \"_\"}}),nq}", Target = typeof(Int64))]
И компилишь, в самом файле даже комент приведён:
// To build this, open an elevated Developer Command Prompt and run:
// csc /t:library autoexp.cs
Студию даже перегружать не надо, autoexp.dll цепляется во время отладки. Работает вроде везде (watch/locals, всплывающий watch, immediate window), как просмотр, так и редактирование.
Re[4]: А почему бы нам не сделать что-нибудь полезное?
Здравствуйте, pilgrim_, Вы писали:
_>По ссылке которую я привёл упоминается файл autoexp.cs, находится он где-то тут: Microsoft Visual Studio\2019\Enterprise\Common7\Packages\Debugger\Visualizers\Original\autoexp.cs . _>Добавляешь, напр. в конец, нужный тебе DebuggerDisplay уровня assembly:
И правда, похоже что работает.
Никаких неприятных побочных эффектов?
... << RSDN@Home 1.0.0 alpha 5 rev. 0>>
Ад пуст, все бесы здесь.
Re[5]: А почему бы нам не сделать что-нибудь полезное?
Здравствуйте, Codealot, Вы писали:
C>В тикете про это буквально написано
Не нашел этого и по ссылке. Ты сам то почитай то, что написал:
I often find myself repeatedly counting digits to read the order of magnitude of large decimal numbers in the watch window (and losing my place!). For example a variable that contains an allocation size in bytes. I’d like the option to use a separator at every thousand. So rather than 7988768 we could see 7,988,768 for example, which is easier to read.
Думаю, что большинство, как и я, подумало о том, что речь о представлении литералов в коде. Почитал отзывы, коих ровно один (без учета стандартных отписок от МС):
I think that it would be better to make this option work in other debug windows too — quick watch, autos, etc. It could be implemented as an option in the VS wide settings, or as an option in the watch window’s context menu — the same way as the “Hexadecimal display” option.
Товарищ тоже пишет "было бы лучше", т.е. и он понял предложение как предложение для подсветки кода.
Так что ты распечатай и смотри на него на ночь, вспоминая какой ты был долблоом.
Ну и у нас ты обязан в теме всё описать. Никто не обязан ходить по ссылке для понимания написанного тобой.
C>Ну а твое предположение что это должно было быть просто странное.
Ты не умеешь выражать свои мысли, но пытаешься собирать единомышленников. Это смешно.
И ничего странного в представлении чисел с разделителями декад в коде я не вижу. Сам отделяю их "_" в своем коде, если они таки встречаются. Делал это еще на Немерле, где эта фича появилась впервые.
C>Кхм, как ты это себе представляешь?
Выводишь поле в отладчике, например:
_pos.ToString("N0"),ac,nq
и радуешься полученному представлению:
1 213 456 789
N0 — формат с отделением декад
,ac — заставляет пересчитывать значение при любом шаге в отладчике
,nq — заставляет отбросить кавычки у строк
Может, конечно, было бы удобнее иметь возможность менять представление прямо из контекстной манишке в отладчике (как с хексами). Но об этом стоило бы написать подробнее в запросе на фичу.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[6]: А почему бы нам не сделать что-нибудь полезное?
Здравствуйте, VladD2, Вы писали:
VD>Не нашел этого и по ссылке. Ты сам то почитай то, что написал: VD>
VD>I often find myself repeatedly counting digits to read the order of magnitude of large decimal numbers in the watch window (and losing my place!). For example a variable that contains an allocation size in bytes. I’d like the option to use a separator at every thousand. So rather than 7988768 we could see 7,988,768 for example, which is easier to read.
Выделил для тех, кто не может осилить несколько предложений.
Так что да, распечатай и читай на ночь.
VD> И ничего странного в представлении чисел с разделителями декад в коде я не вижу. Сам отделяю их "_" в своем коде, если они таки встречаются.
Не может быть!
Какими еще откровениями ты хочешь поделиться?
VD> Немерле, где эта фича появилась впервые.
Здравствуйте, Codealot, Вы писали:
C>Никаких неприятных побочных эффектов?
Не знаю, но в приведённом мною примере много аллокаций, можно вынести форматирование в отдельный статический класс (который в этом же файле и написать), со статическим полем культуры с нужным разделителем и методом типа FormatNumber, который и вызывать из атрибута, тогда будет минимум алокаций.
Re[7]: А почему бы нам не сделать что-нибудь полезное?
C>PS и если у кого-то есть другие несложные и полезные примеры — предлагайте. C>PPS обновил ссылку на задачу
на одной из прошлых работ у одного видел настроено чтобы "!=" отображалась соответствующим символом математическим. имхо читабельность это скорее уменьшает, чем улучшает...
Re[2]: А почему бы нам не сделать что-нибудь полезное?
Здравствуйте, undo75, Вы писали:
U>на одной из прошлых работ у одного видел настроено чтобы "!=" отображалась соответствующим символом математическим. имхо читабельность это скорее уменьшает, чем улучшает...
Я когда VS 2022 впервые поставил себе, то там по умолчанию был шрифт Cascadia Code с лигатурами для !=, => и т.п.
Выглядит интересно, но непривычно. Если так изначально кодить, то может и нормально, но у себя это убрал )
Re[2]: А почему бы нам не сделать что-нибудь полезное?
Здравствуйте, undo75, Вы писали: U>на одной из прошлых работ у одного видел настроено чтобы "!=" отображалась соответствующим символом математическим. имхо читабельность это скорее уменьшает, чем улучшает...
Это называется "лигатуры" и никакой специальной настройки не требует — достаточно выставить подходящий шрифт.
Одно время народ за этим сильно фанател, потом накал восторга ослаб. В основном — потому, что нарушается мелкий user experience: когда я вижу <=> как три символа, мне видно, куда поставить курсор, чтобы стереть нужный из них. Когда эта байда слепляется в одну стрелку, в ней не видно, куда ставить курсор. Для читаемости, конечно, лигатуры лучше (недаром математики в статьях применяют настоящие стрелки, а не комбинации из минусов, равно, и скобок).
Уйдемте отсюда, Румата! У вас слишком богатые погреба.