[FarGroup/FarManager] master: Editor: add line numbers (8594eed18)

0 views
Skip to first unread message

farg...@farmanager.com

unread,
Nov 30, 2025, 5:45:58 AM (7 days ago) Nov 30
to farco...@googlegroups.com
Repository : https://github.com/FarGroup/FarManager
On branch : master
Link : https://github.com/FarGroup/FarManager/commit/8594eed184fb7fb81e02a255cb8bdfc1e0e54e14

>---------------------------------------------------------------

commit 8594eed184fb7fb81e02a255cb8bdfc1e0e54e14
Author: yulian5 <yulia...@gmail.com>
Date: Sat Nov 29 18:12:15 2025 -0800

Editor: add line numbers


>---------------------------------------------------------------

8594eed184fb7fb81e02a255cb8bdfc1e0e54e14
far/FarCze.hlf.m4 | 4 +++
far/FarEng.hlf.m4 | 4 +++
far/FarGer.hlf.m4 | 4 +++
far/FarHun.hlf.m4 | 4 +++
far/FarPol.hlf.m4 | 4 +++
far/FarRus.hlf.m4 | 4 +++
far/FarSky.hlf.m4 | 4 +++
far/FarUkr.hlf.m4 | 4 +++
far/changelog | 5 +++
far/config.cpp | 2 ++
far/config.hpp | 1 +
far/editor.cpp | 42 ++++++++++++++++++++-----
far/editor.hpp | 1 +
far/farcolor.hpp | 1 +
far/farlang.templ.m4 | 71 ++++++++++++++++++++++++++++++++++--------
far/fileedit.cpp | 3 ++
far/fileedit.hpp | 2 +-
far/palette.cpp | 1 +
far/setcolor.cpp | 1 +
far/vbuild.m4 | 2 +-
plugins/luamacro/macrotest.lua | 2 +-
21 files changed, 143 insertions(+), 23 deletions(-)

diff --git a/far/FarCze.hlf.m4 b/far/FarCze.hlf.m4
index 75f38adbe..d66cd048e 100644
--- a/far/FarCze.hlf.m4
+++ b/far/FarCze.hlf.m4
@@ -4035,6 +4035,10 @@ Other tabs won't be converted.
#Show a scrollbar#
Show a scrollbar.

+ #Zobrazovat čísla řádků#
+ Zobrazuje čísla řádků vlevo od textu editoru. Tuto možnost lze přepínat
+stisknutím #Ctrl+F3# během úprav.
+
@=
#Ukládat pozici v souboru#
Uloží a potom obnoví pozici v nedávno upravených souborech. Toto nastavení také
diff --git a/far/FarEng.hlf.m4 b/far/FarEng.hlf.m4
index 12948be44..f5aa66f0c 100644
--- a/far/FarEng.hlf.m4
+++ b/far/FarEng.hlf.m4
@@ -4002,6 +4002,10 @@ Other tabs won't be converted.
#Show a scrollbar#
Show a scrollbar.

+ #Show line numbers#
+ Show line numbers to the left of editor text. This option can be toggled
+by pressing #Ctrl+F3# during editing.
+
@=
#Save file position#
Save and restore positions in the recently edited files. This option also forces
diff --git a/far/FarGer.hlf.m4 b/far/FarGer.hlf.m4
index 5b7730d70..2f0902854 100644
--- a/far/FarGer.hlf.m4
+++ b/far/FarGer.hlf.m4
@@ -4079,6 +4079,10 @@ Other tabs won't be converted.
#Show a scrollbar#
Show a scrollbar.

+ #Zeilennummern anzeigen#
+ Zeigt Zeilennummern links vom Editor-Text an. Diese Option kann während der
+Bearbeitung mit #Strg+F3# umgeschaltet werden.
+
@=
#Dateiposition sichern#
Sichert und restauriert die Position in der zuletzt bearbeiteten Datei. Diese Option sichert und restauriert auch die
diff --git a/far/FarHun.hlf.m4 b/far/FarHun.hlf.m4
index a3e8ebab9..fdaaeb85b 100644
--- a/far/FarHun.hlf.m4
+++ b/far/FarHun.hlf.m4
@@ -4097,6 +4097,10 @@ De a korábbi tabulátorokat nem konvertálja.
#Gördítősáv mutatva#
Az oldalsó gördítősáv megjelenítése a belső szerkesztőben.

+ #Sorokszámok megjelenítése#
+ Megjeleníti a sorok számát a szerkesztő szövegétől balra. Ez az opció
+kapcsolható a #Ctrl+F3# megnyomásával szerkesztés közben.
+
@=
#Fájlpozíció mentése#
Elmenti és visszatölti a legutóbb szerkesztett fájlok szöveghelyzetét és a kódlapot is, ha utóbbit kézzel
diff --git a/far/FarPol.hlf.m4 b/far/FarPol.hlf.m4
index 14e7516c6..aa10f9766 100644
--- a/far/FarPol.hlf.m4
+++ b/far/FarPol.hlf.m4
@@ -4008,6 +4008,10 @@ Wcześniej wprowadzone tabulacji nie zostaną przekonwertowane.
#Pokaż pasek przewijania#
Pokazuje pasek przewijania okna.

+ #Pokaż numery wierszy#
+ Pokazuje numery wierszy z lewej strony tekstu edytora. Opcja ta może być przełączana
+poprzez naciśnięcie #Ctrl+F3# podczas edycji.
+
@=
#Zapamiętaj pozycję kursora w pliku#
Zapisuje i przywraca pozycję w ostatnio edytowanych plikach. Opcja wymusza także przywrócenie strony kodowej,
diff --git a/far/FarRus.hlf.m4 b/far/FarRus.hlf.m4
index acb67d942..88c2bc653 100644
--- a/far/FarRus.hlf.m4
+++ b/far/FarRus.hlf.m4
@@ -4052,6 +4052,10 @@ $ #Настройка редактора#
#Показывать полосу прокрутки#
Показывать полосу прокрутки

+ #Показывать номера строк#
+ Показывать номера строк слева от текста редактора. Можно включить/отключить
+нажатием #Ctrl+F3# во время редактирования.
+
@=
#Сохранять позицию файла#
Сохранять и восстанавливать позицию в недавно отредактированных файлах. Эта опция также вызывает сохранение кодовой
diff --git a/far/FarSky.hlf.m4 b/far/FarSky.hlf.m4
index f7ec696ae..13344da65 100644
--- a/far/FarSky.hlf.m4
+++ b/far/FarSky.hlf.m4
@@ -3997,6 +3997,10 @@ Other tabs won't be converted.
#Show a scrollbar#
Show a scrollbar.

+ #Zobrazovať čísla riadkov#
+ Zobrazuje čísla riadkov naľavo od textu editora. Túto možnosť možno prepínať
+stlačením #Ctrl+F3# počas úprav.
+
@=
#Uložiť pozíciu v súbore#
Uloží pozíciu a vráti sa na ňu v naposledy editovaných súboroch. Ak bola predtým užívateľom
diff --git a/far/FarUkr.hlf.m4 b/far/FarUkr.hlf.m4
index 692f93129..32fcc8dd8 100644
--- a/far/FarUkr.hlf.m4
+++ b/far/FarUkr.hlf.m4
@@ -4057,6 +4057,10 @@ Other tabs won't be converted.
#Show a scrollbar#
Show a scrollbar.

+ #Показувати номери рядків#
+ Показує номери рядків зліва від тексту редактора. Цю опцію можна перемикати
+натисканням #Ctrl+F3# під час редагування.
+
@=
#Зберігати позицію файла#
Зберігати й відновлювати позицію у недавно відредагованих файлах. Ця опція також викликає збереження кодової сторінки,
diff --git a/far/changelog b/far/changelog
index 5c210619c..d2c432575 100644
--- a/far/changelog
+++ b/far/changelog
@@ -1,3 +1,8 @@
+--------------------------------------------------------------------------------
+yulian5 2025-11-29 19:29:09-09:00 - build 6605
+
+1. Editor: add line numbers
+
--------------------------------------------------------------------------------
drkns 2025-11-29 13:18:21+00:00 - build 6604

diff --git a/far/config.cpp b/far/config.cpp
index 0296fa9a4..dce7d5cd0 100644
--- a/far/config.cpp
+++ b/far/config.cpp
@@ -903,6 +903,7 @@ void Options::EditorConfig(EditorOptions &EdOptRef, bool Local)
Builder.AddCheckbox(lng::MEditConfigSelFound, EdOptRef.SearchSelFound);
Builder.AddCheckbox(lng::MEditConfigCursorAtEnd, EdOptRef.SearchCursorAtEnd);
Builder.AddCheckbox(lng::MEditConfigScrollbar, EdOptRef.ShowScrollBar);
+ Builder.AddCheckbox(lng::MEditConfigLineNumbers, EdOptRef.ShowLineNumbers);
Builder.EndColumns();

if (!Local)
@@ -1909,6 +1910,7 @@ void Options::InitConfigsData()
{FSSF_PRIVATE, NKeyEditor, L"SearchAllUseAltFileNameFormat"sv, EdOpt.SearchAllUseAltFileNameFormat, L"*.txt,*.log,*.md,*.csv,*.ini,*.cmd,*.map"sv},
{FSSF_PRIVATE, NKeyEditor, L"SearchSelFound"sv, EdOpt.SearchSelFound, false},
{FSSF_PRIVATE, NKeyEditor, L"SearchCursorAtEnd"sv, EdOpt.SearchCursorAtEnd, false},
+ {FSSF_PRIVATE, NKeyEditor, L"ShowLineNumbers"sv, EdOpt.ShowLineNumbers, false },
{FSSF_PRIVATE, NKeyEditor, L"ShowKeyBar"sv, EdOpt.ShowKeyBar, true},
{FSSF_PRIVATE, NKeyEditor, L"ShowScrollBar"sv, EdOpt.ShowScrollBar, false},
{FSSF_PRIVATE, NKeyEditor, L"ShowTitleBar"sv, EdOpt.ShowTitleBar, true},
diff --git a/far/config.hpp b/far/config.hpp
index 5a763d24a..4124a1ec6 100644
--- a/far/config.hpp
+++ b/far/config.hpp
@@ -568,6 +568,7 @@ public:
BoolOption ShowKeyBar;
BoolOption ShowTitleBar;
BoolOption ShowScrollBar;
+ BoolOption ShowLineNumbers;
BoolOption EditOpenedForWrite;
StringOption SearchAllUseAltFileNameFormat;
BoolOption SearchSelFound;
diff --git a/far/editor.cpp b/far/editor.cpp
index 03f4fabc9..711cb8a13 100644
--- a/far/editor.cpp
+++ b/far/editor.cpp
@@ -243,6 +243,11 @@ void Editor::ShowEditor()
Color = colors::PaletteColorToFarColor(COL_EDITORTEXT);
SelColor = colors::PaletteColorToFarColor(COL_EDITORSELECTEDTEXT);

+ // Calculate line number column width if needed
+ // Minimum width of 3 for "1", "10", "100", etc. plus 1 for spacing
+ const auto LineNumWidth = EdOpt.ShowLineNumbers ?
+ (std::max(3, static_cast<int>(std::log10(static_cast<double>(Lines.size()))) + 1) + 1) : 0;
+
XX2 = m_Where.right - (EdOpt.ShowScrollBar && ScrollBarRequired(ObjHeight(), Lines.size())? 1 : 0);
/* 17.04.2002 skv
Что б курсор не бегал при Alt-F9 в конце длинного файла.
@@ -297,7 +302,7 @@ void Editor::ShowEditor()
//---
//для корректной отрисовки текста с табами у CurLine должна быть корректная LeftPos до начала отрисовки
//так же это позволяет возвращать корректную EditorInfo.LeftPos в EE_REDRAW
- m_it_CurLine->SetHorizontalPosition(m_Where.left, XX2);
+ m_it_CurLine->SetHorizontalPosition(m_Where.left + LineNumWidth, XX2);
m_it_CurLine->FixLeftPos();
//---
if (!Pasting)
@@ -319,14 +324,24 @@ void Editor::ShowEditor()
const Edit::ShowInfo info{ LeftPos, CurPos };
auto Y = m_Where.top;

+ const auto& LineNumColor = colors::PaletteColorToFarColor(COL_EDITORLINENUMBERS);
+ const auto LineNumLeft = m_Where.left;
+ const auto TextLeft = m_Where.left + LineNumWidth;
+
for (auto CurPtr = m_it_TopScreen; CurPtr != Lines.end() && Y <= m_Where.bottom; ++CurPtr, ++Y)
{
CurPtr->SetEditBeyondEnd(true);
- CurPtr->SetPosition({ m_Where.left, Y, XX2, Y });
+ CurPtr->SetPosition({ TextLeft, Y, XX2, Y });
CurPtr->SetLeftPos(LeftPos);
CurPtr->SetTabCurPos(CurPos);
CurPtr->SetEditBeyondEnd(EdOpt.CursorBeyondEOL);

+ if (LineNumWidth > 0)
+ {
+ const auto LineNumStr = far::format(L"{:>{}} "sv, CurPtr.Number() + 1, LineNumWidth - 1);
+ Text({ LineNumLeft, Y }, LineNumColor, LineNumStr);
+ }
+
if(CurPtr==m_it_CurLine)
{
CurPtr->SetOvertypeMode(m_Flags.Check(FEDITOR_OVERTYPE));
@@ -355,16 +370,16 @@ void Editor::ShowEditor()
{
if (CurScreenLine >= m_it_AnyBlockStart.Number() && CurScreenLine < m_it_AnyBlockStart.Number() + VBlockSizeY)
{
- int BlockX1 = VBlockX - LeftPos + m_Where.left;
- int BlockX2 = VBlockX + VBlockSizeX - 1 - LeftPos + m_Where.left;
+ int BlockX1 = VBlockX - LeftPos + m_Where.left + LineNumWidth;
+ int BlockX2 = VBlockX + VBlockSizeX - 1 - LeftPos + m_Where.left + LineNumWidth;

- if (BlockX1 < m_Where.left)
- BlockX1 = m_Where.left;
+ if (BlockX1 < m_Where.left + LineNumWidth)
+ BlockX1 = m_Where.left + LineNumWidth;

if (BlockX2>XX2)
BlockX2=XX2;

- if (BlockX1 <= XX2 && BlockX2 >= m_Where.left)
+ if (BlockX1 <= XX2 && BlockX2 >= m_Where.left + LineNumWidth)
Global->ScrBuf->ApplyColor({ BlockX1, Y, BlockX2, Y }, SelColor);
}

@@ -1881,6 +1896,19 @@ bool Editor::ProcessKeyInternal(unsigned const KeyCode, bool& Refresh, Manager::
return true;
}

+ case KEY_CTRLF3:
+ case KEY_RCTRLF3:
+ {
+ EdOpt.ShowLineNumbers = !EdOpt.ShowLineNumbers;
+ Refresh = true;
+ // Update keybar to reflect new state
+ if (const auto HostFileEditor = GetHostFileEditor())
+ {
+ HostFileEditor->InitKeyBar();
+ }
+ return true;
+ }
+
case KEY_F7:
{
DoSearchReplace(ShowSearchReplaceDialog(false));
diff --git a/far/editor.hpp b/far/editor.hpp
index 314c5e976..35cbed4c0 100644
--- a/far/editor.hpp
+++ b/far/editor.hpp
@@ -97,6 +97,7 @@ public:
void SetCharCodeBase(int NewMode) { EdOpt.CharCodeBase = NewMode % 3; }
int GetCharCodeBase() const { return EdOpt.CharCodeBase; }
void SetShowScrollBar(bool NewMode) { EdOpt.ShowScrollBar = NewMode; }
+ bool GetShowLineNumbers() const { return EdOpt.ShowLineNumbers; }
void SetSearchCursorAtEnd(bool NewMode) { EdOpt.SearchCursorAtEnd = NewMode; }
void SetWordDiv(string_view const WordDiv) { EdOpt.strWordDiv = string(WordDiv); }
const string& GetWordDiv() const { return EdOpt.strWordDiv; }
diff --git a/far/farcolor.hpp b/far/farcolor.hpp
index e5fa649ab..4f14504a5 100644
--- a/far/farcolor.hpp
+++ b/far/farcolor.hpp
@@ -211,6 +211,7 @@ enum PaletteColors
COL_WARNDIALOGSELECTEDDEFAULTBUTTON,
COL_WARNDIALOGHIGHLIGHTDEFAULTBUTTON,
COL_WARNDIALOGHIGHLIGHTSELECTEDDEFAULTBUTTON,
+ COL_EDITORLINENUMBERS,

COL_LASTPALETTECOLOR
};
diff --git a/far/farlang.templ.m4 b/far/farlang.templ.m4
index 2b9612442..7f28d0bcd 100644
--- a/far/farlang.templ.m4
+++ b/far/farlang.templ.m4
@@ -4600,6 +4600,21 @@ MEditConfigScrollbar
"Rodyti šlia&užiklį"
upd:"S&how scrollbar"

+MEditConfigLineNumbers
+"Показывать номера строк"
+"Show line numbers"
+"Zobrazovat čísla řádků"
+"Zeilennummern anzeigen"
+"Sorokszámok megjelenítes"
+"Wyświetl numery wierszy"
+"Mostrar números de línea"
+"Zobrazovať čísla riadkov"
+"Mostra Numeri Di Riga"
+"Показувати номери рядків"
+"Адлюстроўваць нумары радкоў"
+"Rodyti eilučių numerius"
+"Mostrar números de linha"
+
MEditShowWhiteSpace
"Пробел&ьные символы"
"Sh&ow white space"
@@ -8609,19 +8624,19 @@ MEditCtrlF2
""

MEditCtrlF3
-""
-""
-""
-""
-""
-""
-""
-""
-""
-""
-""
-""
-""
+"НомСтр"
+"LineNum"
+"ČíslaŘ"
+"ZeilNr"
+"SorSzám"
+"NrWier"
+"NúmLín"
+"ČísRiad"
+"NumRig"
+"НомРяд"
+"НумРад"
+"EilNr"
+"NúmLin"

MEditCtrlF4
""
@@ -8758,6 +8773,21 @@ MEditCtrlF12
""
""

+MEditCtrlF3Hide
+"СкрСтр"
+"HideNum"
+"SkrýtČ"
+"VerstNr"
+"ElrejtS"
+"UkrWier"
+"OcultN"
+"SkryťČ"
+"NascRig"
+"СховРяд"
+"СхавНум"
+"SlėptEil"
+"OcultN"
+
MEditAltShiftF1
l:
l:// Editor: AltShift
@@ -19985,6 +20015,21 @@ MSetColorEditorScrollbar
"Šliaužiklis"
"Barra de rolagem"

+MSetColorEditorLineNumbers
+"Номера строк"
+"Line numbers"
+"Čísla řádků"
+"Zeilennummern"
+"Sorokszámok"
+"Numery wierszy"
+"Números de línea"
+"Čísla riadkov"
+"Numeri Di Riga"
+"Номери рядків"
+"Нумары радкоў"
+"Eilučių numeriai"
+"Números de linha"
+
MSetColorHelpNormal
l:
"Обычный текст"
diff --git a/far/fileedit.cpp b/far/fileedit.cpp
index 4737d7b59..9556f2f15 100644
--- a/far/fileedit.cpp
+++ b/far/fileedit.cpp
@@ -835,6 +835,9 @@ void FileEditor::InitKeyBar()

Keybar[KBL_MAIN][F8] = f8cps.NextCPname(m_codepage);

+ // Update Ctrl+F3 label based on line numbers state
+ Keybar[KBL_CTRL][F3] = msg(m_editor->GetShowLineNumbers() ? lng::MEditCtrlF3Hide : lng::MEditCtrlF3);
+
Keybar.SetCustomLabels(KBA_EDITOR);
}

diff --git a/far/fileedit.hpp b/far/fileedit.hpp
index 1a30e638b..e16b52e95 100644
--- a/far/fileedit.hpp
+++ b/far/fileedit.hpp
@@ -120,10 +120,10 @@ public:
int GetId() const { return m_editor->EditorID; }
FileEditor* GetById(int ID) { return GetId()==ID?this:nullptr; }
void AutoDeleteColors() const { m_editor->AutoDeleteColors(); }
+ void InitKeyBar() override;

private:
void DisplayObject() override;
- void InitKeyBar() override;
bool ProcessKey(const Manager::Key& Key) override;
bool ProcessMouse(const MOUSE_EVENT_RECORD *MouseEvent) override;
void ShowConsoleTitle() override;
diff --git a/far/palette.cpp b/far/palette.cpp
index bf1235d9f..5a47e94c0 100644
--- a/far/palette.cpp
+++ b/far/palette.cpp
@@ -209,6 +209,7 @@ Init[]
{L"WarnDialog.DefaultButton.Selected"sv, F_BLACK|B_LIGHTGRAY, }, // COL_WARNDIALOGSELECTEDDEFAULTBUTTON,
{L"WarnDialog.DefaultButton.Highlight"sv, F_YELLOW|B_RED, }, // COL_WARNDIALOGHIGHLIGHTDEFAULTBUTTON,
{L"WarnDialog.DefaultButton.Highlight.Selected"sv, F_YELLOW|B_LIGHTGRAY, }, // COL_WARNDIALOGHIGHLIGHTSELECTEDDEFAULTBUTTON,
+ {L"Editor.LineNumbers"sv, F_LIGHTGRAY|B_BLUE, }, // COL_EDITORLINENUMBERS,
};

static_assert(std::size(Init) == COL_LASTPALETTECOLOR);
diff --git a/far/setcolor.cpp b/far/setcolor.cpp
index 355abbdb7..cc10fdb6a 100644
--- a/far/setcolor.cpp
+++ b/far/setcolor.cpp
@@ -502,6 +502,7 @@ void SetColors()
{ lng::MSetColorEditorSelected, COL_EDITORSELECTEDTEXT, {}, { COL_EDITORTEXT } },
{ lng::MSetColorEditorStatus, COL_EDITORSTATUS },
{ lng::MSetColorEditorScrollbar, COL_EDITORSCROLLBAR },
+ { lng::MSetColorEditorLineNumbers, COL_EDITORLINENUMBERS },
},

HelpItems[]
diff --git a/far/vbuild.m4 b/far/vbuild.m4
index dcf469669..0eb9fe5ae 100644
--- a/far/vbuild.m4
+++ b/far/vbuild.m4
@@ -1 +1 @@
-6604
+6605
diff --git a/plugins/luamacro/macrotest.lua b/plugins/luamacro/macrotest.lua
index 7ada1888a..081dd3e11 100644
--- a/plugins/luamacro/macrotest.lua
+++ b/plugins/luamacro/macrotest.lua
@@ -1813,7 +1813,7 @@ end

local function test_AdvControl_Colors()
local allcolors = assert_table(far.AdvControl("ACTL_GETARRAYCOLOR"))
- assert(#allcolors == 146)
+ assert(#allcolors > 140)
for n=1,#allcolors do
local color = assert(far.AdvControl("ACTL_GETCOLOR", n-1))
assert(color.Flags and color.ForegroundColor and color.BackgroundColor)


Reply all
Reply to author
Forward
0 new messages