Smart End — переход на последний непробельный символ строки

Здесь выкладываются готовые к использованию макросы и скрипты.
Post Reply
Shmuel
Posts: 6820
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 41 times
Been thanked: 528 times

Smart End — переход на последний непробельный символ строки

Post by Shmuel »

В другой теме был предложен макрос "smart end". Не удержался, сделал свой вариант:
  1. Macro {
  2.  
  3.   description="Smart End"; area="Editor"; key="End";
  4.  
  5.   action = function()
  6.  
  7.     local inf, s = editor.GetInfo(), editor.GetString(nil,nil,2)
  8.  
  9.     local p1, p2 = s:cfind("%s*$"), s:len()+1
  10.  
  11.     editor.SetPosition(nil,nil,inf.CurPos>=p1 and inf.CurPos~=p2 and p2 or p1)
  12.  
  13.   end;
  14.  
  15. }
User avatar
Wave
Posts: 1885
Joined: Thu 04 Aug, 2005 18:47
Has thanked: 14 times
Been thanked: 26 times

Re: Smart end

Post by Wave »

Если в том макросе заменить string.len(s) на s:len(), он работает правильно. В этом макросе курсор улетает за пределы строки. Кстати, дошло, улетает в строках, содержащих русский текст в утф8. Где только латиница, там уходит в конец строки.
Пользуюсь ФАРом больше 20 лет © собирательный.
Shmuel
Posts: 6820
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 41 times
Been thanked: 528 times

Re: Smart end

Post by Shmuel »

Исправил, спасибо.
User avatar
Wave
Posts: 1885
Joined: Thu 04 Aug, 2005 18:47
Has thanked: 14 times
Been thanked: 26 times

Re: Smart end

Post by Wave »

А чем этот макрос лучше того? Или только другой-свой?
Пользуюсь ФАРом больше 20 лет © собирательный.
Shmuel
Posts: 6820
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 41 times
Been thanked: 528 times

Re: Smart end

Post by Shmuel »

Wave wrote:А чем этот макрос лучше того? Или только другой-свой?
Намного короче, легче в понимании и поддержке.
Ну и другой-свой тоже.
User avatar
SUSim
Posts: 1636
Joined: Thu 18 Feb, 2010 17:32
Has thanked: 9 times
Been thanked: 26 times

Re: Smart end

Post by SUSim »

У мне имхо ещё понятнее :)
  1. local Str=Editor.Value
  2.  
  3. local Pos=Editor.RealPos
  4.  
  5. local Last=Str:cfind("%s*$")
  6.  
  7. local Len=Str:len()
  8.  
  9. Editor.Pos(1,2,Pos~=Last and Last or Len+1)
ну SmartHome для комплекта
  1. local Str=Editor.Value
  2.  
  3. local Pos=Editor.RealPos
  4.  
  5. local First=Str:find("[^%s]+")
  6.  
  7. Editor.Pos(1,2,Pos~=First and First or 1)
SimSU ··· ·· -- ··· ··-
User avatar
zg
zero-gravity
Posts: 6016
Joined: Tue 15 Mar, 2005 17:36
Location: riga
Been thanked: 185 times
Contact:

Re: Smart end

Post by zg »

SUSim wrote:У мне имхо ещё понятнее :)
  1. Editor.Pos(1,2,Pos~=Last and Last or Len+1)
понятность зашкаливает, да.
User avatar
John Doe
Бюрократ
Posts: 13807
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 73 times
Been thanked: 426 times
Contact:

Post by John Doe »

Из темы выделено отдельно обсуждение Smart Home/End © Denis
User avatar
John Doe
Бюрократ
Posts: 13807
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 73 times
Been thanked: 426 times
Contact:

Re: Smart End

Post by John Doe »

Для коллекции, хочу указать, что в пакете fl_scripts (автор темы имеет к нему непосредственное отношение) среди прочего есть smartkeys.lua, реализующий другую функцию — Smart Home:
  1. -- Sets position to the first nonspace character
  2.  
  3. local function smarthome()
  4.  
  5.     local p = editor.GetInfo().CurPos
  6.  
  7.     local p_S = editor.GetString(nil,nil,2):find('%S') or 1
  8.  
  9.     editor.SetPosition(nil,nil,(p==1 or p>p_S) and p_S or 1,nil,nil,1)
  10.  
  11.     editor.Redraw()
  12.  
  13. end
  14.  
  15.  
  16.  
  17. Macro { description="SmartHome"; area="Editor"; key="Home"; action=smarthome;}
P.S.
Там же реализованы и другие smartkeys: SmartTab и SmartBS.
Но код SmartBS закомментирован и неиспользуется, а SmartTab работает на мой взгляд неочевидно (возможно я просто не разобрался).
Shmuel
Posts: 6820
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 41 times
Been thanked: 528 times

Re: Smart End

Post by Shmuel »

John Doe wrote:Для коллекции хочу указать, что в пакете fl_scripts (автор темы имеет к нему непосредственное отношение) среди прочего есть smartkeys.lua, реализующий другую функцию — Smart Home:
Автор темы в основном поддерживает этот пакет (например, перевод на API Far3/LuaFAR3), но не развивает. SmartHome из этого пакета использую.
User avatar
John Doe
Бюрократ
Posts: 13807
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 73 times
Been thanked: 426 times
Contact:

Smart End — переход на последний непробельный символ строки

Post by John Doe »

Скрипт не учитывает что при непостоянных блоках выделение должно сбрасываться.
Denis
Posts: 1444
Joined: Tue 05 Apr, 2005 18:12
Has thanked: 10 times
Been thanked: 5 times

Smart End — переход на последний непробельный символ строки

Post by Denis »

Есть вариант с поддержкой:
http://forum.farmanager.com/viewtopic.php?p=109968
Post Reply

Return to “Полезные макросы и скрипты”