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

157

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

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

Фрэнк
источник

Ответы:

108

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

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

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

Pianosaurus
источник
203

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

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-_ или Cx Cu Отменить последнюю команду редактирования. Вы можете отменить весь путь до пустой строки.

движение

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

Убить и дергать

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

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

Обновить

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

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

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

$ set -o vi

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

бонус

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

wonder.mice
источник
3
Я предпочитаю этот ответ, потому что он объясняет [сущность / корень / причину позади], как работает ввод с клавиатуры bash (откуда он берется), т.е. Readline.
Евгений
6
В стандартном терминале Ubuntu Meta (M) - это Alt + Shift, если только вы не отключите сочетания клавиш для доступа к меню, в этом случае это просто Alt.
brianpeiris
2
В Kde в Konsole Meta (M) является альтернативным ключом
Pipo
Проблема в том, что Meta + F не работает, если Meta - ALT, поскольку ALT предоставляет доступ к меню запущенной программы (в данном случае терминала). Есть ли альтернатива?
Питикос,
1
что такое Mf, так что вы здесь не используете контроль, так что же это?
PositiveGuy
33

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

Соединяя жизнь с Android
источник
2
Вы только что повторили мою эффективность
Lay González
В каких средах это работает? Я думаю, только в Mac OS?
Abdull
Работает на удаленном SSH Linux, даже через сервер Jump.
Джон Цзян
10

Я предпочитаю режим редактирования 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», а затем вернуться к началу слова.

paxdiablo
источник
Нет необходимости в скрипте - просто нажмите «v» в режиме vi и откройте командную строку в редакторе. Вы можете лучше отформатировать командную строку, err, «script» с помощью новых строк, и нет необходимости в временном файле. :) Таким образом, "V / 25" доставит вас туда в 4 символа.
dannysauer
Но тогда вам нужно больше, чем клавиша <Enter>, чтобы запустить его. @dannysauer
CDR
9

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

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

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

Эдсон Медина
источник
8

Запустив команду один раз, запустите fc

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

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

DBR
источник
4

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

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

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

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

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

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

Фрэнк
источник
0

Использовать мышь

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

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

set mouse=a
set ttymouse=xterm2

Если вы затем хотите сделать выделение текста в терминале (вместо передачи щелчка мышью на vim), удерживайте Shift при нажатии; это, конечно, специфично для терминала.

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

user7610
источник
0

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

Отныне простой щелчок левой кнопкой мыши в некоторой позиции в командной строке поместит курсор туда.

Abdull
источник
0

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

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

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

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

Sunfloro
источник
0

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

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

Можно найти на GitHub

Больше информации о другой пост

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

Tinmarino
источник
0

Это может быть не самый быстрый, но это должно быть здесь, некоторые читают о перемещениях курсора 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
NVRM
источник