Самый быстрый способ переместить курсор в командной строке терминала? - PullRequest
144 голосов
/ 18 марта 2009

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

Скажем, я использовал клавишу со стрелкой или 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

Ответы [ 13 ]

186 голосов
/ 17 августа 2012

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

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

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

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

Bare Essentials

  • 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 mode

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

$ set -o vi

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

Бонус

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

100 голосов
/ 13 мая 2009

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

  • Используйте 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 действительно удобен и быстр, без всяких проблем с редакторами, и вы увидите результаты до запуска команды (в отличие от расширений истории).

27 голосов
/ 21 июля 2016

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

10 голосов
/ 18 марта 2009

Я предпочитаю режим редактирования 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 найти лучшее решение, менее чем за 5 нажатий клавиш (хотя я не хочу начинать религиозную войну).

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

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

9 голосов
/ 11 мая 2012

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

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

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

8 голосов
/ 18 марта 2009

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

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

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

4 голосов
/ 06 января 2015

Если вы хотите продвинуться на определенное количество слов, нажмите M-<n> (M- для мета и обычно это клавиша ESC), затем нажмите цифру. Это отправляет повторный аргумент в 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

2 голосов
/ 20 марта 2014

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

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

gedit  ~/.inputrc

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

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

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

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

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

fo

, и вскоре появится команда стрелка вверх

1 голос
/ 18 марта 2009

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

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

0 голосов
/ 31 марта 2019

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

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

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

Подробнее о еще один пост

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...