Оболочка с лучшими возможностями редактирования


11

Оболочки (по крайней мере, что я знаю) имеют действительно плохие возможности редактирования команд.

Например:

  • Я не могу навести курсор на любую точку команды.
  • Я не могу выделить и вернуться / удалить / заменить текст в команде.

В настоящее время они настолько отвлекают, я использую gedit для редактирования команд перед их вставкой в ​​терминал.

Есть ли какое-то решение, которое подходит для них?


2
Вы объединяете терминал с оболочкой.
JdeBP

Ответы:


13

Баш действительно хорош в этом. Вам просто нужно изучить его ярлыки. Например (в режиме emacs по умолчанию):

  • Ctrl+ A: перейти к началу строки.
  • Ctrl+ E: перейти к концу строки.
  • Ctrl+ B: переместить один символ назад.
  • Ctrl+ F: двигаться на один символ вперед.
  • Alt+ B: переместить одно слово назад.
  • Alt+ F: двигаться на одно слово вперед.
  • Ctrl+ K: удалить (вырезать) все до конца строки.
  • Alt+ D: удалить (вырезать) слово после курсора.
  • Ctrl+ W: удалить (вырезать) слово перед курсором.
  • Ctrl+ Y: yank (вставить) то, что находится в буфере (например, что вы вырезали с помощью Ctrl+ Kили Alt+ D)

И еще много. Читайте, man readlineчтобы увидеть, что еще доступно. Вы можете назначить разные ярлыки, поместив их в ~/.inputrc. Например, чтобы сделать Ctrl+ Leftвернуться на одно слово и Ctrl+ Rightперейти на одно слово вперед, добавьте это к своему ~/.inputrc:

"\e[1;5D": backward-word 
"\e[1;5C": forward-word

Чтобы узнать, что означают эти странные коды, нажмите Ctrl+, Vа затем нажмите клавишу, которую вы хотите использовать. Если вы попробуете с Ctrl+ Right, вы увидите ^[[1;5C. Заменить ^[с \eв ~/.inputrc.


Вы также можете захотеть заглянуть в другие оболочки. Популярные "современные", многофункциональные оболочки включают в себя:


При этом gnome-terminalвам придется использовать ESCкнопку вместо того, ALT чтобы перемещаться на одно слово вперед и назад. , .. или переключитесь на терминал, который не использует Alt для своего меню приложения. , , как xterm или sakura
Сергей Колодяжный

@ Серж не в моей системе, спасибо. Я не знаю, настроили ли вы его таким образом или он настроен по умолчанию Ubuntu. Esc часто используется как синоним Alt.
Тердон

Нет совместного использования буферов среза между терминалами.
Крейг Хикс,

7

Вы можете отредактировать пустую или частично набранную команду в редакторе по вашему выбору, установив EDITORв редакторе по вашему выбору и нажав CTRL+ X+ Eили CTRL+ X/ CTRL+ E, чтобы открыть редактируемую строку в EDITOR;

Например, установка EDITORна + geditзаставит CTRL+ X+ Eи CTRL+ X/ CTRL+ Eоткрыть текущую строку в Gedit.

Чтобы сделать это постоянное решение, вы можете установить EDITORв ~/.bashrc.

Это позволяет использовать даже полнофункциональный графический текстовый редактор для редактирования команды; чтобы запустить отредактированную команду, просто сохраните и закройте документ.


Эту же функцию можно включить в Zsh, добавив следующее в ~/.zshrc:

autoload -U edit-command-line
zle -N edit-command-line
bindkey '^xe' edit-command-line
bindkey '^x^e' edit-command-line

2
Это также может быть вызвано fcкомандой, если установлена ​​переменная FCEDIT. Хороший ответ!
Сергей Колодяжный

1
@Serg Спасибо, однако fcоткрывает предыдущую команду (которая даже аккуратнее определенным образом). Я не знал об этом, спасибо!
Кос

6

Терминалы не имеют возможности редактирования текста сами. Терминалы обеспечивают область текста и соединяют клавиатуру с чем-то. Но то, что вы запускаете внутри терминала, определяет, что он может делать.

Такие оболочки , как bashправило, являются первым, что вы найдете внутри терминала. Поскольку оболочки работают на основе команд, вы можете редактировать только текущую команду. обеспечивает отличное редактирование команд по сравнению с оболочкой Bourne cshили, kshтем не менее, вряд ли вы захотите отредактировать даже небольшой рассказ.

Текстовые редакторы - это одна из команд, которые вы можете вызывать в оболочке. Ведущими примерами являются и . vimили emacsдаст вам возможность редактировать почти все. Оба включают встроенные среды программирования для расширения их возможностей для любой проблемы, с которой вы сталкиваетесь.

Таким образом, решение состоит в том, чтобы лучше понять, что эти инструменты делают и предназначены для этого, и выбрать правильный для работы .


Я знаю разницу, но можно ли что-то сделать, чтобы улучшить командное редактирование bash?
UniversallyUniqueID

1
положить в сценарий?
цыплята

0

Обычно терминалы позволяют выделять текст мышью, но оболочка не знает об этом. Так , к сожалению , ни bash, zsh, fishни esподдерживает редактирование мыши основе. Я думаю, что для этого им нужно будет взять под контроль терминал.

Однако (и это является немного растянуть) , если открыть Вим или GVim, а затем ввести команды оболочки с помощью:

:!...

затем вы можете щелкнуть мышью, чтобы перейти в любое место строки . (Вам нужно будет :set mouse=aсначала, если это еще не включено.) Клавиши редактирования в этом режиме можно увидеть с:help cmdline-editing

Vim также имеет довольно мощный командный режим истории, который может быть достигнут нажатием q:. Оттуда вы можете вытащить, удалить и вставить, используя команды нормального режима Vim. В этом режиме вы можете получить выбор с помощью мыши, а затем удалить желаемую функцию (нажав d).

Важным предупреждением здесь является то, что Vim на самом деле не поддерживает сеанс live shell. Каждая выполняемая вами команда будет выполняться в дочернем процессе. Поэтому любые изменения, внесенные в переменные среды или параметры оболочки дочерним процессом, будут потеряны.

Тем не менее, вы можете изменять переменные окружения из в процессе Vim, и использовать их из командной строки Vim, и они будут даже в дочерние процессы:

:let $FOO="bar"        " the $ and the quotes are mandatory here

:echo $FOO             " Vim's own echo command
bar

:!echo "$FOO"          " Passing the variable to a shell command
bar

:!bash                 " Opening a child shell
$ echo "$FOO"
bar

Так что если вы хотите притвориться, что Vim на самом деле какая-то странная оболочка, тогда вы можете наслаждаться ее расширенными возможностями редактирования! Вероятно , самым большим недостатком является то , что вы должны будете начать каждую команду, набрав либо :!илиq:

Да, и, кстати, если вы хотите получить выходные данные команды оболочки в текущий буфер Vim, вы можете сделать это следующим образом (но будьте осторожны, это приведет к засорению вашей текущей строки):

:,!ls
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.