Переход к определённой строке в cmd

Russian main discussion
Post Reply
  • Author
  • Message
Offline
Posts: 41
Joined: Wed Mar 23, 2016 1:18 pm

Переход к определённой строке в cmd

Post by Dimsok »

Искал команду для перехода к определённой строке/символу через командную строку, не нашёл. Имеется ли такая возможность?

Offline
Posts: 348
Joined: Mon Jun 03, 2019 2:33 am

Re: Переход к определённой строке в cmd

Post by AZJIO »

Dimsok
Посмотрел в справке-html, там есть раздел ком-строка, но нет указанной возможности, хотя имеет смысл. Но мне бы хотелось, чтобы в ком. строке была возможность "Открыть и найти слово", типа

Code: Select all

AkelPad.exe Find"найти слово"
а прыжок в позицию типа

Code: Select all

AkelPad.exe GoTo"3"
AkelPad.exe GoTo"3:8"
AkelPad.exe GoTo"-1:10000"
то есть в строку 3, в строку 3 колонка 8, в позицию 10000

Offline
Posts: 41
Joined: Wed Mar 23, 2016 1:18 pm

Post by Dimsok »

И как это в комстроку прописать? "\AkelPad.exe" "file" GoTo"3:8", к примеру, спрашивает, создать новый файл C\go to 3:8?

Offline
Posts: 348
Joined: Mon Jun 03, 2019 2:33 am

Post by AZJIO »

Dimsok wrote:И как это в комстроку прописать? "\AkelPad.exe" "file" GoTo"3:8", к примеру, спрашивает, создать новый файл C\go to 3:8?
:D ключевое слово "Но мне бы хотелось" и далее перечисление чего бы хотелось...

Как вариант, можно скриптом, то есть после открытия ещё придётся нажать хоткей. А также я не нашёл возможности запустить скрипт на старте AkelPad. Но можно запустить скрипт AutoIt3 и вызвать команду прыжка.

Offline
Posts: 41
Joined: Wed Mar 23, 2016 1:18 pm

Post by Dimsok »

Может, через какой-нибудь скрипт попробовать. Есть что-то похожее?

Offline
Posts: 348
Joined: Mon Jun 03, 2019 2:33 am

Post by AZJIO »

Dimsok wrote:Может, через какой-нибудь скрипт попробовать. Есть что-то похожее?
Ну вот пример на AutoIt3:
#include <SendMessage.au3>
#include <GuiRichEdit.au3>

; Запуск AkelPad
; Run('C:\ваш путь\AkelPad\AkelPad.exe')

; Ожидание максимум 5 секунд до момента, когда оно станет существующим

$hWnd = WinWait("[CLASS:AkelPad4]", "", 5) ; без таймаута (5) ожидание бесконечно
If Not $hWnd Then
    MsgBox(4096, 'Сообщение', 'Окно не найдено, завершаем работу скрипта')
    Exit
EndIf


; Ожидание 1 секунды зависит от количества файлов, иначе следующие команды отправятся в пустоту. Если AkelPad открыт, то задержка не нужна.
Sleep(1000)

$hEdit = ControlGetHandle($hWnd, "", "AkelEditW1")
If Not $hEdit Then
    MsgBox(4096, 'Сообщение', 'Окно редактирования не найдено, завершаем работу скрипта')
    Exit
EndIf


; Любой из вариантов
; _SendMessage($hEdit, 177, 122, 122)
_GUICtrlRichEdit_GotoCharPos($hEdit, 122)
Ещё всякие команды для примера
#include <GuiRichEdit.au3>

; Запуск AkelPad
; Run('C:\ваш путь\AkelPad\AkelPad.exe')

; Ожидание максимум 5 секунд до момента, когда оно станет существующим

$hWnd = WinWait("[CLASS:AkelPad4]", "", 5) ; без таймаута (5) ожидание бесконечно
If Not $hWnd Then
    MsgBox(4096, 'Сообщение', 'Окно не найдено, завершаем работу скрипта')
    Exit
EndIf


$hEdit = ControlGetHandle($hWnd, "", "AkelEditW1")
If Not $hEdit Then
    MsgBox(4096, 'Сообщение', 'Окно редактирования не найдено, завершаем работу скрипта')
    Exit
EndIf


$info = ''
$info &= "Число строк" & @TAB & @TAB & _GUICtrlRichEdit_GetLineCount($hEdit) & @CRLF
$info &= "1-я видимая" & @TAB & @TAB & _GUICtrlRichEdit_GetNumberOfFirstVisibleLine($hEdit) & @CRLF
$info &= "Позиция начала строки" & @TAB & @TAB & _GUICtrlRichEdit_GetFirstCharPosOnLine($hEdit) & @CRLF
$info &= "Символов в строке" & @TAB & @TAB & _GUICtrlRichEdit_GetLineLength($hEdit, -1) & @CRLF
$info &= "Флаг модификации" & @TAB & @TAB & _GUICtrlRichEdit_IsModified($hEdit) & @CRLF
$info &= "В буфере вставляемые данные?" & @TAB & @TAB & _GUICtrlRichEdit_CanPaste($hEdit) & @CRLF
; $info &= "Включает флаг только чтение" & @TAB & @TAB & _GUICtrlRichEdit_SetReadOnly($hEdit) & @CRLF

MsgBox(0, 'Сообщение', $info)

Offline
Site Admin
Posts: 6403
Joined: Thu Jul 06, 2006 7:20 am

Post by Instructor »

Вариант №1

Code: Select all

AkelPad.exe "c:\File.txt" /if(`SendMain(1204 /*AKD_GOTO*/, 0x1 /*GT_LINE*/, "10:3")`, "", "")
Вариант №2

Code: Select all

AkelPad.exe "c:\File.txt" /Call("Scripts::Main", 1, "EvalCmd.js", `AkelPad.SendMessage(AkelPad.GetMainWnd(), 1204 /*AKD_GOTO*/, 0x1 /*GT_LINE*/, "10:3");`)
Last edited by Instructor on Mon Aug 05, 2019 6:58 am, edited 2 times in total.

Offline
Posts: 41
Joined: Wed Mar 23, 2016 1:18 pm

Post by Dimsok »

Во втором примере ""Scripts::Main', 1, "в "c:\Program Files\Total Commander\Plugins\exe\AkelFiles\Plugs\Scripts.dll"

Offline
Posts: 41
Joined: Wed Mar 23, 2016 1:18 pm

Post by Dimsok »

AkelPad.exe "c:\File.txt" /if(`SendMain(1204 /*AKD_GOTO*/, 0x1 /*GT_LINE*/, "10:3")`, "", "")
А есть возможность выделять определённое количество символов? Например, 10:3,6?

Offline
Posts: 348
Joined: Mon Jun 03, 2019 2:33 am

Post by AZJIO »

Dimsok wrote:А есть возможность выделять определённое количество символов? Например, 10:3,6?
Если есть возможность запустить скрипт js, то можно всё.

Offline
Posts: 41
Joined: Wed Mar 23, 2016 1:18 pm

Post by Dimsok »

Покажите пример.

Offline
Posts: 348
Joined: Mon Jun 03, 2019 2:33 am

Post by AZJIO »

Dimsok wrote:Покажите пример.
Пример чего?
Вызов команды показали выше.
В скрипт EvalCmd.js добавь команду выделения текста

Code: Select all

AkelPad.SetSel(5, 10);
Чтобы выделить по строке нужно определить позицию символа начала строки и добавить к ней позицию.

Code: Select all

// Получаем позицию символа в начале указанной строки

function GetBeginLine(nLine)
{
  return SendMessage(hEditWnd, 187 /*EM_LINEINDEX*/, nLine, 0);
}
Для поиска ваших последующих хотелок скачиваете коллекцию скриптов архивами, распаковав в папку, далее программой поиска текста в файлах (например моей) задаёте что искать, например "получить начало строки", с помощью QTranslate переводите в "get the beginning of the line" и вас есть предположительное название функции GetLine GetBeginLine, так как Get используется во всех случаях, то ищем Line или "Line(" что подразумевает конец имени функции
Image

Offline
Posts: 3234
Joined: Wed Nov 29, 2006 1:19 pm
Location: Киев, Русь
Contact:

Post by VladSh »

Dimsok
AZJIO wrote:В скрипт EvalCmd.js добавь команду выделения текста

Code: Select all

AkelPad.SetSel(5, 10);
Не надо в EvalCmd.js добавлять никаких команд по выделению. Нужно создать свой скрипт, в котором делаешь, что хочешь, а в командной строке вызываешь не EvalCmd.js, а свой скрипт. Передача параметров своему скрипту по аналогии с передачей параметров скрипту EvalCmd.js.
Для простого выделения можно использовать ком. строку Instructor'а с EvalCmd.js, но вместо AkelPad.SendMessage() вставить AkelPad.SetSel(5, 10);
Post Reply