Самый быстрый способ переместить курсор в командной строке терминала?

Каков наилучший способ перемещения по заданной очень длинной командной строке в терминале?

Скажем, я использовал клавишу со стрелкой или Ctrl - R, чтобы получить эту длинную командную строку:

./cmd --option1 --option2 --option3 --option4 --option5 --option6 --option7 --option8 --option9 --option10 --option11 --option12 --option13 --option14 --option15 --option16 --option17 --option18 --option19 --option20 --option21 --option22 --option23 --option24 --option25 --option26 --option27 --option28 --option29 --option30 --option31 --option32 --option33 --option34 --option35 --option36 --option37 --option38 --option39 --option40 --option41 --option42 --option43 --option44 --option45 --option46 --option47 --option48 --option49 --option50 

Теперь мне нужно переместить (начиная с начала или конца строки) курсор на --option25, чтобы что-то там изменить.

Каков самый быстрый способ добраться туда? Обычно я делаю Ctrl - A, чтобы перейти к началу, а затем повторно Alt - F для перемещения вперед, слово за словом (или Ctrl - E, чтобы перейти в конец и Alt - B, чтобы вернуться назад). Но на длинной линии, которая занимает слишком много времени. Должен быть способ поиска и перехода непосредственно к той части, которую мне нужно изменить, например. option25?

Ответ 1

Так как это еще не закрыто, вот еще несколько вариантов.

  • Используйте Ctrl + x, а затем Ctrl + e, чтобы открыть текущую строку в редакторе, указанном $FCEDIT или $EDITOR или emacs (в этом порядке).
  • Если вы запустили команду раньше, нажмите Ctrl + r для обратного поиска истории и введите option25 (в этом случае). Отобразится строка. Нажмите Tab, чтобы начать редактирование на этом этапе.
  • Используйте расширение истории с помощью модификатора s///. Например. !-2:s/--option25/--newoption/ перезапустит вторую-последнюю команду, но заменит опцию25. Чтобы изменить последнюю команду ./cmd, используйте синтаксис !string: !./cmd:s/--option25/--newoption/
    Любой разделитель может использоваться вместо/в замене.
  • Если вы редактируете предыдущую строку, вы можете использовать быструю подстановку: ^--option25^--newoption
  • Поиск символов. Это было упомянуто Pax и может выполняться в обычном режиме emacs с Ctrl + ] для прямого поиска и Ctrl + Alt + ] для обратного поиска.

Я рекомендую второй вариант. Ctrl + r действительно удобен и быстр, без проблем с редакторами, и вы видите результаты перед запуском команды (в отличие от расширений истории).

Ответ 2

Чтобы было ясно, вам не нужен "быстрый способ перемещения курсора в терминале командной строки". На самом деле вам нужен быстрый способ навигации по командной строке в вашей оболочке программы.

Bash, например, очень распространенная оболочка. Он использует библиотеку Readline для реализации ввода из командной строки. И так сказать, очень удобно знать привязки Readline, поскольку они используются не только в bash. Например, GDB также использует Readline для обработки ввода.

В документации Readline вы можете найти все привязки, связанные с навигацией (и многое другое): http://www.gnu.org/software/bash/manual/bash.html#Readline-Interaction

Короткая копия-вставка, если вышеприведенная ссылка не работает:

Голые предметы первой необходимости

  • Ctrl-b Перейти на один символ назад.
  • Ctrl-f Переместиться вперед на один символ.
  • [DEL] или [Backspace] Удалить символ слева от курсора.
  • Ctrl-d Удалить символ под курсором.
  • Ctrl-_ или C-x C-u Отменить последнюю команду редактирования. Вы можете отменить весь путь до пустой строки.

Движение

  • Ctrl-a Перейти к началу строки.
  • Ctrl-e Перейти к концу строки.
  • Meta-f Перемещение вперед по слову, где слово состоит из букв и цифр.
  • Meta-b Переместиться назад на слово.
  • Ctrl-l Очистить экран, перепечатывая текущую строку сверху.

Убей и дергай

  • Ctrl-k Убить текст с текущей позиции курсора до конца строки.
  • M- d Убить от курсора до конца текущего слова или, если между словами, до конца следующего слова. Границы слова такие же, как у M- f.
  • M- [DEL] Убить от курсора начало текущего слова или, если между словами, начало предыдущего слова. Границы слов такие же, как и в M- b.
  • Ctrl-w Убить курсор от предыдущего пробела. Это отличается от M-, потому что границы слова отличаются.
  • Ctrl-y Возвращает последний убитый текст обратно в буфер при курсоре.
  • M- y Поверните кольцо убийства и дерните новую вершину. Вы можете сделать это, только если предыдущая команда была C-y или M- y.

М - мета-ключ. Для Max OS X Terminal вы можете включить "Использовать опцию как мета-ключ" в меню "Настройки"/"Клавиатура". Для Linux это сложнее.

Обновление

Также обратите внимание, что Readline может работать в двух режимах:

  • Режим Emacs (который используется по умолчанию)
  • vi режим

Чтобы переключить Bash в режим vi:

$ set -o vi

Лично я предпочитаю режим vi, так как я использую vim для редактирования текста.

Бонус

В приложении MacOS Terminal (и в iTerm тоже) вы можете нажать Option-Click, чтобы переместить курсор (курсор переместится в положение щелчка). Это даже работает внутри vim.

Ответ 3

Удерживайте клавишу Option и нажмите, где вы хотите, чтобы курсор перемещался, и терминал бросает курсор на точное место.

Ответ 4

Я предпочитаю режим редактирования vi (так как эти нажатия клавиш теперь встроены в мой спинной мозг (мозг не используется вообще), а также CTRL-K, CTRL-X из WordStar 3.3:-). Вы можете использовать командную строку set -o vi для ее активации (и set -o emacs для возврата).

В Vi это будет (ESC-K, чтобы получить линию сначала, конечно) "f5;;B" (без двойных кавычек).

Конечно, вы должны понять, что на линии, чтобы уйти от этого. В принципе, это

f5 to find the first occurrence of "5" (in --option5).
;  to find the next one (in --option15).
;  to find the next one (in --option25).
B  to back up to the start of the word.

Посмотрим, смогут ли emacs aficionados найти лучшее решение, менее 5 нажатий клавиш (хотя я не хочу начинать религиозную войну).

Задумывались ли вы, может быть, вам захотелось бы положить эту ужасно длинную команду в script?: -)

На самом деле, я могу пойти лучше, чем это: "3f5B", чтобы найти третье вхождение "5", а затем вернуться к началу слова.

Ответ 5

Используйте Meta-b/Meta-f для перемещения назад/вперед по словам соответственно.

В OSX Meta переводится как ESC, что отстой.

Но в качестве альтернативы вы можете открыть настройки терминала → настройки → профиль → клавиатуру и проверить "использовать опцию в качестве мета-ключа"

Ответ 6

После запуска команды один раз запустите fc

Он запустит $EDITOR с помощью предыдущей команды, затем вы можете использовать свой обычный редактор для изменения команды. Когда вы сохраните и выйдете, файл будет выполнен.

.. но, как сказал Пакс, командная строка не особенно хороша для редактирования абсурдно длинных строк - почему бы не сделать команду в script?

Ответ 7

Если вы хотите переместить определенное количество слов, нажмите M-<n> (M- для Meta и его обычно клавиша эвакуации), затем нажмите номер. Это отправляет повторному аргументу в readline, поэтому вы можете повторить любую команду, которую хотите, - если вы хотите перейти вперед, а затем нажмите M-<n> M-f, и курсор переместит вперед <n> количество слов.

например.

 $|echo "two three four five six seven"
 $ M-4
 (arg: 4) echo "two three four five six seven"
 $ M-f
 $ echo "two three four| five six seven"

Итак, для вашего примера из курсора в начале строки вы нажмете M-26 M-f, и ваш курсор будет на --option25| -или- в конце строки M-26 M-b будет помещен ваш курсор в --|option25

Ответ 8

Инкрементный поиск истории

в терминале введите:

gedit  ~/.inputrc

затем скопируйте вставку и сохраните

"\e[A": history-search-backward
"\e[B": history-search-forward
"\e[C": forward-char
"\e[D": backward-char

все, что вам нужно сделать, чтобы найти предыдущую команду: введите первые две или три буквы и стрелку вверх, чтобы вы там быстро сказали, что я хочу:

for f in *.mid ; do timidity "$f"; done

все, что мне нужно сделать, это ввести

fo

и скоро появится стрелка вверх.

Ответ 9

Один из вариантов - использовать M-x shell в emacs. Это обеспечивает все возможности редактирования и нажатия клавиш, которые emacs имеет, поэтому C-s можно использовать для поиска текста option25, например.

(Но я все же предпочел бы быть в реальной оболочке терминала, если бы кто-то мог указать мне на хороший поиск и редактировать средства.)

Ответ 10

Используйте мышь

Иногда самый простой способ редактирования командной строки - использовать мышь. Некоторые предыдущие ответы дают команду открыть вашу текущую строку в вашем $EDITOR. Для меня (zhs с grml config) эта комбинация Alt+e. Если вы включите мышь в своем редакторе, вы можете использовать ее.

Чтобы включить мышь в Vim, добавьте это в свой ~/.vimrc

set mouse=a
set ttymouse=xterm2

Если вы хотите сделать выбор текста в терминале (вместо передачи mouseclick в vim), удерживайте Shift при нажатии; конечно, это конечно.

Сидадмины не должны бояться мыши.

Ответ 11

В Cygwin вы можете активировать такую ​​функцию, щелкнув правой кнопкой мыши по окну. Во всплывающем окне выберите "Параметры"... → "Мышь" → "Активировать клики". Поместите курсор командной строки → Применить.

Теперь, просто щелкнув левую кнопку мыши в некоторой позиции в командной строке, поместите туда курсор.

Ответ 12

первый: EDITOR экспорта = 'nano -m'

тогда: CTRL + X CTRL + E в последовательности.

Ваша текущая строка откроется в нано-редакторе с включенной мышью. Вы можете нажать на любую часть текста и редактировать

затем CTRL + X для выхода и y для подтверждения сохранения.

Ответ 13

Я создал скрипт для перемещения командной строки при нажатии мыши :

  1. Включить отчеты об отслеживании мыши xterm
  2. Установите привязки readline, чтобы использовать escape-последовательность, генерируемую щелчками

Его можно найти на github

Подробнее о другом посте

Будет работать, если echo -e "\e[?1000;1006;1015h" # Enable tracking печатать escape-последовательности на терминале при щелчке мышью

Ответ 14

Некоторое чтение о перемещениях курсора ANSI

Экранирующие последовательности ANSI позволяют перемещать курсор по экрану по желанию. Это более полезно для полноэкранных пользовательских интерфейсов, созданных сценариями оболочки, но также может использоваться в подсказках. Последовательности побега движения следующие:

- Position the Cursor:
  \033[<L>;<C>H
     Or
  \033[<L>;<C>f
  puts the cursor at line L and column C.
- Move the cursor up N lines:
  \033[<N>A
- Move the cursor down N lines:
  \033[<N>B
- Move the cursor forward N columns:
  \033[<N>C
- Move the cursor backward N columns:
  \033[<N>D

- Clear the screen, move to (0,0):
  \033[2J  or \033c
- Erase to end of line:
  \033[K

- Save cursor position:
  \033[s
- Restore cursor position:
  \033[u

(...)

Попробуйте ввести следующую строку кода в приглашении (немного понятнее, что происходит, если приглашение находится на несколько строк ниже терминала, когда вы вводите это): echo -en "\033[7A\033[1;35m BASH \033[7B\033[6D" Это должно переместить курсор на семь строк вверх по экрану, распечатать слово "BASH", а затем вернитесь туда, где он начал производить нормальное приглашение.


Примеры:

Переместите курсор назад на 7 строк:

echo -e "\033[7A"

Переместите курсор на строку 10, столбец 5:

echo -e "\033[10;5H"

Быстрое отображение цветов кода, чтобы раскрасить программу:

echo -e "\033[35;42m" ; ifconfig