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


156

Який найкращий спосіб пересуватися по заданому дуже довгому командному рядку в терміналі?

Скажіть, я використовував клавішу зі стрілкою або 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?

Відповіді:


107

Оскільки це ще не закрито, ось ще кілька варіантів.

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


203

Щоб було зрозуміло, вам не потрібно "швидкий спосіб переміщення курсору в командному рядку терміналу ". Те, що ви насправді хочете, - це швидкий спосіб навігації по командному рядку у вашій програмі оболонки .

Bash - це дуже поширена оболонка, наприклад. Він використовує бібліотеку Readline для здійснення введення командного рядка. І так би мовити, дуже зручно знати прив'язки Readline, оскільки вони використовуються не тільки в баші. Наприклад, gdb також використовує Readline для обробки вводу.

У документації Readline ви можете знайти всі прив’язки, пов'язані з навігацією (та багато іншого): http://www.gnu.org/software/bash/manual/bash.html#Readline-Interaction

Коротка копія-вставка, якщо посилання вище знижується:

Голі основи

  • 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] Убити від курсору початок поточного слова або, якщо між словами, до початку попереднього слова. Межі слів ті ж, що і Мб.
  • Ctrl-w Убити курсор на попередній пробіл. Це відрізняється від М-, оскільки межі слова різняться.
  • Ctrl-y Яньте останній вбитий текст назад у буфер за курсором.
  • Мій Оберніть кільце для вбивства та витягніть новий верх. Це можна зробити лише в тому випадку, якщо попередньою командою є Cy або My.

M - мета-ключ. Для Max OS X Terminal ви можете включити "Використовувати параметр як мета-клавіша" в Налаштуваннях / Клавіатурі для цього. Для Linux це складніше.

Оновлення

Також зауважте, що Readline може працювати в двох режимах:

Щоб переключити Bash на режим vi:

$ set -o vi

Особисто я віддаю перевагу режиму vi, оскільки використовую vim для редагування тексту.

Бонус

У додатку Terminal macOS (і в iTerm теж) ви можете натиснути Option-Click, щоб перемістити курсор (курсор переміститься в позицію, на яку натиснули). Це навіть працює всередині vim.


3
Я віддаю перевагу цій відповіді, тому що вона отримує [сутність / корінь / причина], як працює вхід баш клавіатури (звідки вона походить), тобто Readline.
eugenevd

6
У стандартному терміналі Ubuntu Meta (M) є Alt + Shift, якщо ви не відключите комбінації клавіш для доступу до меню, в цьому випадку це просто Alt.
brianpeiris

2
У Kde in Konsole мета (M) - клавіша alt
Піпо

Проблема полягає в тому, що Meta + F не працює, якщо Meta ALT, оскільки ALT надає доступ до меню запущеної програми (у цьому випадку терміналу). Чи є альтернатива?
Пітікос

1
що таке Mf, тож ви тут не використовуєте контроль, так що це?
PositiveGuy

33

Утримуючи клавішу Option і натисніть туди, куди ви хочете перемістити курсор, і Terminal кидає курсор на точне місце.


2
Ви просто дублювали мою ефективність
Lay González

У яких середовищах це працює? Я думаю, лише в Mac OS?
Абдулл

Працює на віддаленому Linux ssh, навіть через сервер стрибків.
Джон Цзян

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


Немає необхідності в сценарії - просто натисніть «v» у режимі vi та відкрийте командний рядок у редакторі. Ви можете відформатувати командний рядок, помилитися, "скрипт" ще краще, використовуючи нові рядки, і тимчасовий файл не потрібен. :) Отже, "v / 25" потрапляє туди за 4 символи.
dannysauer

Але тоді для його запуску вам потрібно більше, ніж клавіша <Enter>. @dannysauer
CDR

9

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

В OSX Meta перекладається як ESC, який смокче.

Але також можна відкрити налаштування терміналу -> налаштування -> профіль -> клавіатуру та встановити прапорець "використовувати опцію як мета-клавішу"


8

Після запуску команди один раз, запустіть fc

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

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


4

Якщо ви хочете просунути певну кількість слів вперед, натисніть M-<n>( M-це для Meta і, як правило, клавіша втечі), а потім натисніть число. Це посилає аргумент повторення для перегляду рядка, тому ви можете повторити будь-яку команду, яку ви хочете - якщо ви хочете йти вперед, тоді натисніть, 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. Для мене (zhs з grml config) це поєднання Alt+e. Якщо увімкнути мишку у своєму редакторі, ви можете скористатися нею.

Щоб увімкнути мишу у Vim, додайте це до свого ~ / .vimrc

set mouse=a
set ttymouse=xterm2

Якщо потім ви хочете зробити вибір тексту в терміналі (замість передачі клацання миші vim), утримуйте клавішу Shift при натисканні; це, звичайно, термінал.

Сисадміни не повинні боятися миші.


0

У Cygwin можна активувати таку функцію, клацнувши правою кнопкою миші на вікні. У спливаючому вікні виберіть Опції ... -> Миша -> активуйте курсор командного рядка Клацання місця -> Застосувати.

Відтепер просто клацання лівою кнопкою миші в якомусь положенні в командному рядку розмістить курсор там.


0

перше: експортувати EDITOR = 'nano -m'

потім: CTRL + X CTRL + E послідовно.

Ваш поточний рядок відкриється в наноредакторі з увімкненням миші. Ви можете натиснути будь-яку частину тексту та відредагувати

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


0

Я створив сценарій, щоб змусити курсор командного рядка переміщатись клацанням миші :

  1. Увімкнути звіт про відстеження миші xterm
  2. Встановіть прив'язки читання, щоб споживати послідовність переходу, що генерується кліками

Його можна знайти на github

Більше інформації про інший пост

Працює, якщо echo -e "\e[?1000;1006;1015h" # Enable trackingдрукувати аварійні послідовності на терміналі при натисканні миші


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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.