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

StackOverflow https://stackoverflow.com/questions/657130

  •  19-08-2019
  •  | 
  •  

Вопрос

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

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

./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-А добраться до начала, а затем неоднократно Альтернативный вариант-Ф двигаться вперед, слово за словом (или Ctrl-Э идти до конца и Альтернативный вариант-Б чтобы затем вернуться назад).Но в длинной очереди это занимает слишком много времени.Должен быть способ поиска и перехода непосредственно к той части, которую мне нужно изменить, например. option25?

Это было полезно?

Решение

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

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

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

Другие советы

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

Баш это очень распространенная оболочка, например.Оно использует 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-[DEL] Убить от курсора начало текущего слова или, если между словами, до начала предыдущего слова.Границы слов такие же, как и у М-б.
  • Ctrl-w Уничтожить курсор от предыдущего пробела.Это отличается от M-, потому что границы слов различаются.
  • Ctrl-y Вернуть последний удаленный текст обратно в буфер, на котором находится курсор.
  • М-й Поверните убийственное кольцо и дерните новую вершину.Вы можете сделать это, только если предыдущая команда — C-y или M-y.

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

Обновлять

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

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

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

$ set -o vi

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

Бонус

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

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

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

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

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

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

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

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

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

If you want to move forward a certain number of words, hit M-<n> (M- is for Meta and its usually the escape key) then hit a number. This sends a repeat argument to readline, so you can repeat whatever command you want - if you want to go forward then hit M-<n> M-f and the cursor will move forward <n> number of words.

E.g.

 $|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"

So for your example from the cursor at the beginning of the line you would hit, M-26 M-f and your cursor would be at --option25| -or- from the end of the line M-26 M-b would put your cursor at --|option25

Incremental history searching

in terminal enter:

gedit  ~/.inputrc

then copy paste and save

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

all you need to do to find a previous command is to enter say the first 2 or 3 letters and upward arrow will take you there quickly say i want:

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

all i need to do is enter

fo

and hit upward arrow command will soon appear

One option is to use M-x shell in emacs. That provides all editing facilities and keystrokes that emacs has, so C-s can be used to search the text option25, for example.

(But I'd still prefer to be in the real terminal shell instead if someone can point me to good search and edit facilities.)

Use the mouse

Sometimes, the easiest way to edit a commandline is using a mouse. Some previous answers give a command to open your current line in your $EDITOR. For me (zhs with grml config) that combination is Alt+e. If you enable mouse in your editor, you can make use of it.

To enable mouse in Vim, add this to your ~/.vimrc

set mouse=a
set ttymouse=xterm2

If you then want to do a text selection in terminal (instead of passing the mouseclick to vim), hold Shift when you click; this is terminal specific, of course.

Sysadmins should not be afraid of the mouse.

In Cygwin, you can activate such feature by right-clicking the window. In the pop-up window, select Options... -> Mouse -> activate Clicks place command line cursor -> Apply.

From now on, simply clicking the left mouse button at some position within the command line will place the cursor there.

first: export EDITOR='nano -m'

then: CTRL+X CTRL+E in sequence.

You current line will open in nano editor with mouse enable. You can click in any part of text and edit

then CTRL+X to exit and y to confirm saving.

I made a script to make the command line cursor move on mouse click :

  1. Enable xterm mouse tracking reporting
  2. Set readline bindings to consume the escape sequence generated by clicks

It can be found on github

More info on another post

Will work if echo -e "\e[?1000;1006;1015h" # Enable tracking print escape sequences on terminal when clicking with mouse

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top