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

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

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

Post by Shmuel » Sun 19 May, 2013 13:32

В другой теме был предложен макрос "smart end". Не удержался, сделал свой вариант:
  1. Macro {
  2.   description="Smart End"; area="Editor"; key="End";
  3.   action = function()
  4.     local inf, s = editor.GetInfo(), editor.GetString(nil,nil,2)
  5.     local p1, p2 = s:cfind("%s*$"), s:len()+1
  6.     editor.SetPosition(nil,nil,inf.CurPos>=p1 and inf.CurPos~=p2 and p2 or p1)
  7.   end;
  8. }

User avatar
Wave
Posts: 1707
Joined: Thu 04 Aug, 2005 18:47
Location: Харьков, Украина
Has thanked: 2 times
Been thanked: 9 times
Contact:

Re: Smart end

Post by Wave » Sun 19 May, 2013 13:53

Если в том макросе заменить string.len(s) на s:len(), он работает правильно. В этом макросе курсор улетает за пределы строки. Кстати, дошло, улетает в строках, содержащих русский текст в утф8. Где только латиница, там уходит в конец строки.
Пользуюсь ФАРом больше 15 лет © собирательный.

Shmuel
Posts: 5096
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 11 times
Been thanked: 140 times

Re: Smart end

Post by Shmuel » Sun 19 May, 2013 14:03

Исправил, спасибо.

User avatar
Wave
Posts: 1707
Joined: Thu 04 Aug, 2005 18:47
Location: Харьков, Украина
Has thanked: 2 times
Been thanked: 9 times
Contact:

Re: Smart end

Post by Wave » Sun 19 May, 2013 14:06

А чем этот макрос лучше того? Или только другой-свой?
Пользуюсь ФАРом больше 15 лет © собирательный.

Shmuel
Posts: 5096
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 11 times
Been thanked: 140 times

Re: Smart end

Post by Shmuel » Sun 19 May, 2013 14:11

Wave wrote:А чем этот макрос лучше того? Или только другой-свой?
Намного короче, легче в понимании и поддержке.
Ну и другой-свой тоже.

User avatar
SUSim
Posts: 1472
Joined: Thu 18 Feb, 2010 17:32
Has thanked: 4 times
Been thanked: 3 times

Re: Smart end

Post by SUSim » Sun 19 May, 2013 18:58

У мне имхо ещё понятнее :)
  1. local Str=Editor.Value
  2. local Pos=Editor.RealPos
  3. local Last=Str:cfind("%s*$")
  4. local Len=Str:len()
  5. Editor.Pos(1,2,Pos~=Last and Last or Len+1)
ну SmartHome для комплекта
  1. local Str=Editor.Value
  2. local Pos=Editor.RealPos
  3. local First=Str:find("[^%s]+")
  4. Editor.Pos(1,2,Pos~=First and First or 1)
SimSU ··· ·· -- ··· ··-

User avatar
zg
zero-gravity
Posts: 5240
Joined: Tue 15 Mar, 2005 17:36
Location: riga
Been thanked: 42 times
Contact:

Re: Smart end

Post by zg » Sun 19 May, 2013 19:03

SUSim wrote:У мне имхо ещё понятнее :)
  1. Editor.Pos(1,2,Pos~=Last and Last or Len+1)
понятность зашкаливает, да.

User avatar
John Doe
Бюрократ
Posts: 11095
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 12 times
Been thanked: 66 times

Post by John Doe » Wed 18 Dec, 2013 12:48

Из темы выделено отдельно обсуждение Smart Home/End © Denis

User avatar
John Doe
Бюрократ
Posts: 11095
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 12 times
Been thanked: 66 times

Re: Smart End

Post by John Doe » Wed 18 Dec, 2013 13:53

Для коллекции, хочу указать, что в пакете fl_scripts (автор темы имеет к нему непосредственное отношение) среди прочего есть smartkeys.lua, реализующий другую функцию — Smart Home:
  1. -- Sets position to the first nonspace character
  2. local function smarthome()
  3.     local p = editor.GetInfo().CurPos
  4.     local p_S = editor.GetString(nil,nil,2):find('%S') or 1
  5.     editor.SetPosition(nil,nil,(p==1 or p>p_S) and p_S or 1,nil,nil,1)
  6.     editor.Redraw()
  7. end
  8.  
  9. Macro { description="SmartHome"; area="Editor"; key="Home"; action=smarthome;}
P.S.
Там же реализованы и другие smartkeys: SmartTab и SmartBS.
Но код SmartBS закомментирован и неиспользуется, а SmartTab работает на мой взгляд неочевидно (возможно я просто не разобрался).

Shmuel
Posts: 5096
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 11 times
Been thanked: 140 times

Re: Smart End

Post by Shmuel » Wed 18 Dec, 2013 14:24

John Doe wrote:Для коллекции хочу указать, что в пакете fl_scripts (автор темы имеет к нему непосредственное отношение) среди прочего есть smartkeys.lua, реализующий другую функцию — Smart Home:
Автор темы в основном поддерживает этот пакет (например, перевод на API Far3/LuaFAR3), но не развивает. SmartHome из этого пакета использую.

User avatar
John Doe
Бюрократ
Posts: 11095
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 12 times
Been thanked: 66 times

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

Post by John Doe » Thu 13 Nov, 2014 09:27

Скрипт не учитывает что при непостоянных блоках выделение должно сбрасываться.

Denis
Posts: 1390
Joined: Tue 05 Apr, 2005 18:12
Has thanked: 2 times
Been thanked: 2 times

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

Post by Denis » Thu 13 Nov, 2014 09:47

Есть вариант с поддержкой:
viewtopic.php?p=109968

Post Reply

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