Как пропустить слова в терминале OS X?

Допустим, я написал длинную команду в терминале Mac OSX, т.е.

say "Hello, how are you? I am good thank you. How is it going with you? Fine, thanks"

и теперь я хочу изменить слово Hello в Hi,

Чтобы сделать это, прямо сейчас я должен продолжать нажимать (или удерживать) левую клавишу клавиатуры, пока "курсор" не доходит до конца слова Hello, а затем удалите его. Обычный метод "удержания опции" не работает, как в большинстве других приложений OS X.

Есть ли способ пропустить слово за раз вместо этого (или любой другой, более короткий, способ получить курсор там)?

2 ответа

Решение

Редактирование командной строки - это функция вашей оболочки, а не терминала. Возможно, ваша оболочка - bash, и, вероятно, стиль ее редактирования в командной строке установлен на "emacs".

Вот несколько комбинаций клавиш в стиле Emacs, которые вам могут пригодиться:

  • Ca: beginning-of-line
  • Ce: end-of-line
  • Mf: forward-word
  • Мб: backward-word
  • CD: delete-char
  • Md: kill-word (удалить следующее слово)
  • M-DEL: backward-kill-word

C-x означает Control+x, поэтому Ca - это Control+a.

M-x означает Meta+x, но, вероятно, на клавиатуре нет клавиши Meta. Таким образом, вместо этого вы можете использовать ESC x (т.е. Escape затем x). Терминал имеет настройку для автоматической отправки ESC до нажатия клавиш с зажатой опцией. Использование этой функции отключает расширенную обработку символов, которую обычно обеспечивает Mac OS X при использовании модификатора Option. Итак, если вы используете несколько расширенных символов и хотите, чтобы Option+x отправлял ESC x, вы можете включить эту опцию Terminal.

В вашем примере есть много способов перейти к "Hello":

  • Ищите "Привет": Cr H e l l o Cj (или ESC)
    • В обычном Emacs вы просто используете RET (Return), чтобы завершить поиск в текущем местоположении и вернуться к редактированию. Но в bash привязки по умолчанию заставляют RET (то есть Cm) всегда выполнять текущую строку, даже если активен инкрементальный поиск. Таким образом, часть Cj/ESC является отклонением от нормального Emacs.
  • Перейти к началу строки и двигаться вперед: Ca Mf Cf (или )
  • Перейти к началу строки, затем перейти по словам: Ca Mf Mf Mb
  • Много используйте Мб (только реально выполнимо, если вы сопоставите Option с Meta).

Есть также несколько способов выполнить желаемую замену:

  • удалить слово и заменить его: Md H i
  • удалить символы и заменить их: Cd Cd Cd Cd Cd H i
  • передвиньте "H" и удалите следующую работу, замените ее: Cf Md i
  • сдвиньте "H" и удалите оставшиеся символы, замените их: Cf Cd Cd Cd Cd i

Если вы остановились в конце слова (возможно, через Ca Mf Mf), вы можете использовать M-DEL H i.

Вы могли бы сделать что-то вроде bind -P | less чтобы найти другие интересные привязки. Обратитесь к разделу readline справочной страницыbash (или разделам readline на страницах info bash) для получения более подробной информации.

Привязка readline по умолчанию для forward-word Мета-F (bash(1) Страница man, раздел READLINE, подраздел " Команды для перемещения". Я не уверен, что Meta переводит в OS X, хотя. Вариант, возможно.

Другие вопросы по тегам