Самый быстрый способ переместить курсор в командной строке терминала?
Каков наилучший способ перемещения по заданной очень длинной командной строке в терминале?
Скажем, я использовал клавишу со стрелкой или 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
Я создал скрипт для перемещения командной строки при нажатии мыши :
- Включить отчеты об отслеживании мыши xterm
- Установите привязки 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