1 (изменено: Samotek, 2014-11-13 21:20:36)

Тема: AHK: Копирование и замена слова в текстовом редакторе

Часто по ходу работы в текстовом редакторе (AkelPad, PlSqlDeveloper) необходима последовательность действий - в месте, в котором расположен курсор редактирования (не мыши) выделить слово, скопировать его в буфер и вторая последовательность - заменить слово, в котором расположен курсор редактирования (не мыши) на значение из буфера. Поиском не нашел. Подскажите, пожалуйста, есть ли решение?
зы: И чтоб при этом мышь не трогать! )

2

Re: AHK: Копирование и замена слова в текстовом редакторе

В "Блокноте" можно так: удерживая Ctrl, нажать стрелку влево. Далее, не отпуская Ctrl, зажать Shift и нажать стрелку вправо. Или наоборот, сначала стрелку вправо, затем влево.
Правда, при этом захватывается пробел справа слова. Если он не нужен, тогда в конце ещё отпустить Ctrl (продолжая удерживать Shift) и нажать стрелку влево.

3

Re: AHK: Копирование и замена слова в текстовом редакторе

Кстати да, подсказали, попробую. Тут недостаток, если заработает - позиция редактирования убегает. Но, может еще какие способы есть. Как, например кликнуть два раза мышкой в позицию редактирования? Можно ее вычислить для управления мышью?

4

Re: AHK: Копирование и замена слова в текстовом редакторе

позиция редактирования убегает

Как это?

5

Re: AHK: Копирование и замена слова в текстовом редакторе

Ну, если курсор стоял в середине слова и надо выделить слово, то после нажатия ^Left  ^+Right он станет в конце.

6 (изменено: Irbis, 2014-11-13 15:26:31)

Re: AHK: Копирование и замена слова в текстовом редакторе

Так "не убегает". Дополнительно, при копировании не захватываются знаки препинания, например точки и запятые в конце слова логичней оставлять. Если это не нужно, можно просто исправить шаблон (переменная Stop)
F12 копирует слово в буфер, более длительное нажатие вставляет из буфера вместо слова в позиции курсора.

Stop = [\'\"\/\\\?\!\,\.\<\>\:\;\&%A_Space%].*
F12::
   KeyWait, F12, T0.25
   if ErrorLevel { ; paste
      KeyWait, F12
      Text := Clipboard
      Clipboard =
      SendInput ^{Left}^+{Right}^{Ins}
      ClipWait, 0.2
      Pos := StrLen(Clipboard)-StrLen(RegExReplace(Clipboard, Stop))
      SendInput +{Left %Pos%}%Text%
      Clipboard := Text
   }
   Else { ; copy
      Clipboard =
      SendInput ^+{Left}^{Ins}
      ClipWait, 0.2
      Pos := StrLen(Clipboard)
      Clipboard =
      SendInput {Right}{Left}^+{Right}^{Ins}^{Left}{Right %Pos%}
      ClipWait, 0.2
      Clipboard := RegExReplace(Clipboard, Stop)
   }
Return

7

Re: AHK: Копирование и замена слова в текстовом редакторе

rbis
Спасибо, точно, все работает!

8

Re: AHK: Копирование и замена слова в текстовом редакторе

Хорошо, что работает.

+ открыть спойлер

Хотя я уже нашел баг, кому интересно, могут найти и исправить.

9 (изменено: stealzy, 2014-11-13 16:04:24)

Re: AHK: Копирование и замена слова в текстовом редакторе

+ Offtopic:

Делал аналогичный скрипт, но не удалось заставить хорошо работать, если курсор стоит вначале слова. Скрипт смотрел,что попало в буфер, и если это был пробел/перенос соответственно реагировал. Работало это долго и ненадежно(задержки попадания в буфер).

Обнаружил, что в Notepad++ в плагине TextFX есть функция Mark Word or Find Reverse.
Повесил на хоткей. Можно макросом объеденить с Copy/Paste.

Как для других редакторов не знаю, но вещь нужная.

10

Re: AHK: Копирование и замена слова в текстовом редакторе

Irbis
Конечно давай исправления. Да еще бы хорошо эти две процедуры (копирования и вставки) оформить подпрограммами (чтоб можно было прицепить их к любой клавише и окну) и еще добавить при копировании проверку: если при копировании в тексте уже есть выделение, то копировать не слово, а выделенное. Тогда мне вообще думать не придется!

11

Re: AHK: Копирование и замена слова в текстовом редакторе

Копирование-вставка в виде процедур, выделенный текст скопируется.

Global Stop
Stop = [\'\"\/\\\?\!\,\.\(\)\<\>\:\;\&%A_Space%].* ; "
F12::
   KeyWait, F12, T0.25
   if ErrorLevel
   {
      KeyWait, F12
      Paste()
   }
   Else
   Copy()
Return

Copy()
{
   Clipboard =
   SendInput ^{Ins}
   ClipWait, 0.2
   if !ErrorLevel
      Return
   SendInput ^+{Left}^{Ins}
   ClipWait, 0.2
   Pos := StrLen(Clipboard)
   Clipboard =
   SendInput {Right}{Left}^+{Right}^{Ins}^{Left}{Right %Pos%}
   ClipWait, 0.2
   Clipboard := RegExReplace(Clipboard, Stop)
}

paste()
{
   Text := Clipboard
   Clipboard =
   SendInput ^{Left}^+{Right}^{Ins}
   ClipWait, 0.2
   Pos := StrLen(Clipboard)-StrLen(RegExReplace(Clipboard, Stop))
   SendInput +{Left %Pos%}%Text%
   Clipboard := Text
}

12

Re: AHK: Копирование и замена слова в текстовом редакторе

Irbis
Супер! Спасибо большое! Добавил себе еще при вставке, если есть выделенное, то вместо него, чтоб вставлялось! Ценная фича в результате получилась, особенно для программистов - переменные копировать!

13

Re: AHK: Копирование и замена слова в текстовом редакторе

Irbis пишет:

F12 копирует слово в буфер, более длительное нажатие вставляет из буфера вместо слова в позиции курсора.

В SciTe не работает.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

14

Re: AHK: Копирование и замена слова в текстовом редакторе

Не работает от слова "совсем", или что-то делает, но не то, что заявлено?
Работа проверялась в стандартном блокноте и в том, который с двумя плюсами, и в командной строке ТоталКомандера. Поздней посмотрю, в чем причина.

15

Re: AHK: Копирование и замена слова в текстовом редакторе

Копирует только часть слова.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

16 (изменено: Samotek, 2014-11-14 11:26:56)

Re: AHK: Копирование и замена слова в текстовом редакторе

Часть слова копируется и у меня в AkelPad надо в функции Copy

SendInput {Right}{Left}^+{Right}^{Ins}^{Left}{Right %Pos%}

заменить на

SendInput {Right}^{Left}^+{Right}^{Ins}{Left}{Right}^{Left}{Right %Pos%}

Так работает и в AkelPad и в PLSqlDeveloper


А вообще для полного счастья и универсализма хотелось бы задействовать эти функции на клавиши Ctrl+C и Ctrl+V. Но, чтоб так можно было сделать нужна функция определения находится ли каретка в середине слова CheckInWord например. Может на границе слова(тогда и однобуквенные слова можно было бы менять). Но я бы сделал только внутри слова, чтоб при копировании строк и вставке перед первым символом в первой позиции строки вставка происходила бы без замены. И если не внутри слова - передовались бы дальше Ctrl+C или Ctrl+V. Но в ней есть проблема, которую я сразу не решил: как определить, что при ^{Left} каретка (надо для определения символа слева) не перескочит на предыдущую строку (AkelPad) или не останетcя на текущей (PlSqlDeveloper). Надо в  набор символов Stop включить символы конца строки, а я еще не знаю как. Может Irbis поможет.