Поскольку при поиске/замене в редакторе с “[x] Regular expressions” значение опции “[x] Whole words” игнорируется, я написал макрос, который позволяет сгладить это неудобство, пусть и
не очень красивым способом — при включении галки “Только целые слова” изменяет регэксп дописыванием в начало и конец так, чтобы текст по нему находился только
между границами слова (и чтобы номера/имена групп при этом не менялись); при выключении галки те префикс и суффикс убираются. И всё это происходит, только если включена опция “Регулярные выражения”.
-- See http:// forum.farmanager.com/viewtopic.php?p=137190#p137190
-- TODO extend to various RESearch dialogs
local SEARCH_TXT_ITEM_POS = 5 -- in both Search and Replace
local WHLWRD_CHK_ITEM_POS = 10 -- in both Search and Replace
local REGEXP_CHK_ITEM_POS = 12 -- in both Search and Replace
Macro {
description = 'Search/Replace: smart toggle Whole Words for RegExp';
area = 'Dialog'; key = 'AltW';
condition = function()
return ( Dlg.Id == far.Guids.EditorSearchId or
Dlg.Id == far.Guids.EditorReplaceId )
and Dlg.GetValue(REGEXP_CHK_ITEM_POS) ~= 0
end;
action = function()
local prefix, suffix = '\\b(?:', ')\\b'
local searchText = Dlg.GetValue(SEARCH_TXT_ITEM_POS)
if Dlg.GetValue(WHLWRD_CHK_ITEM_POS) == 0 then
searchText = prefix .. searchText .. suffix
else
local prefLen, suffLen = prefix:len(), suffix:len()
if searchText:sub( 1, prefLen ) == prefix and
searchText:sub( -suffLen, -1 ) == suffix then
searchText = searchText:sub( prefLen + 1, -( suffLen + 1 ) )
else
searchText = nil -- flag that no change is required
end
end
if searchText ~= nil then
Dlg.SetFocus(SEARCH_TXT_ITEM_POS)
Keys('CtrlY') -- TODO preserve caret position, selection, etc
print(searchText)
end
Keys('AKey');
end;
}
Прошу покритиковать. (Про идиому “condExpr and trueExpr or falseExpr
” и про сравнение с nil
знаю.)
Пожелание: хорошо бы аналогичную логику спрятать под капотом, чтобы поиск целыми словами
просто работал и с регэкспами, притом не засоряя их.