Как получить длинные командные строки для переноса на следующую строку?

Для 12.10

В 12.10 отключение онлайн-видео в Dash упрощается. Просто выполните поиск конфиденциальности в Dash и откройте это окно.

Затем отключите параметр для включения результатов онлайн-поиска.

1
задан 19 October 2015 в 12:31

5 ответов

Убедитесь, что все непечатаемые байты в вашем PS1 содержатся в \[ \]. В противном случае bash будет считать их в строке запроса. Он использует длину подсказки, чтобы определить, когда нужно обернуть линию.

Например, здесь bash подсчитывает приглашение шириной 19 столбцов, а приглашение, отображаемое терминалом, имеет ширину всего 10 колонок (My prompt, написанный в циане, и >, написанный по умолчанию):

PS1='\e[36mMy prompt\e[0m>'         # bash count: 19, actual: 10

, в то время как здесь он подсчитывает только приглашение шириной 10 колонок, поскольку он игнорирует байты между специальными \[ и \] escapes:

PS1='\[\e[36m\]My prompt\[\e[0m\]>' # bash count: 10, actual: 10

Для хорошей практики используйте tput для генерации выводов терминала, а не для их жесткого кодирования:

cyan=$(tput setaf 6) # \e[36m
reset=$(tput sgr0)   # \e[0m
PS1='\[$cyan\]My prompt\[$reset\]>'

См. http: // mywiki. wooledge.org/BashFAQ/053, а также http://wiki.bash-hackers.org/scripting/terminalcodes для tput.

118
ответ дан 25 May 2018 в 23:11
  • 1
    Это отличное объяснение проблемы, что принятый ответ не дает – Jamie Cook 2 October 2013 в 05:41
  • 2
    В последней строке кода PS1='...': почему одиночные кавы не препятствуют подстановке $cyan и $reset? – andrybak 15 November 2015 в 17:52
  • 3
    @andrybak, они предотвращают замену $cyan и $reset, но PS1 оценивается каждый раз при печати приглашения. Вы можете увидеть это, попробовав PS1='$var> ', а затем дайте var различные значения и посмотрите, как изменяется запрос. Затем попробуйте PS1="$var> " и заметьте, что приглашение остается статическим; $var расширился во время назначения, а не каждый раз PS1. – geirha 16 November 2015 в 23:52
  • 4
    Это потрясающе. Большое спасибо за размещение этого! Это упрощает и читает квадратные скобки. – phyatt 2 December 2015 в 00:41
  • 5
    Как я делаю эту работу PS1=${PS1}"\e]2;$@\a". Я попробовал PS1=${PS1}"\[\e]2;\]$@\[\a\]" – Ramana Reddy 28 July 2016 в 13:27

У меня была аналогичная проблема и, наконец, нашел простое решение.

Добавьте следующую строку в ваш файл .bashrc:

COLUMNS=250

Затем введите source ~/.bashrc, чтобы получить желаемый эффект.

9
ответ дан 25 May 2018 в 23:11
  • 1
    В некоторых случаях, таких как узкие терминаторные подразделения, проблема не в подсказках цветных символов, а только в неправильном значении COLUMNS. Этот ответ отвел меня из очень беспокойной дыры! – Carles Sala 13 January 2014 в 19:31
  • 2
    Выход из системы не нужен. Сделайте source .bashrc. Ваше приглашение будет немедленно обновляться – Sergiy Kolodyazhnyy 17 August 2015 в 04:24
  • 3
    Я обнаружил, что, поскольку у меня не было магазина setwinsize, установленного для моего bash, поэтому он не обновлял COLUMNS вправо, см. unix.stackexchange.com/a/167911/8337 – rogerdpack 12 September 2015 в 01:11
  • 4
    Я сделал export COLUMNS=250, а затем export TERM=xterm, и он был счастлив. – Philip Kearns 2 August 2016 в 17:18

У меня была такая же проблема с пользовательским цветным приглашением, хотя я содержал цветовые коды в пределах \[ и \] разделителей. Оказывается, у bash есть проблемы, отражающие цвета внутри функции. Я просто использовал переменные для моей подсказки, и хотя мой .bashrc немного менее изящный, теперь все работает хорошо.

5
ответ дан 25 May 2018 в 23:11
  • 1
    Если кто-то все еще читает это, на самом деле можно избежать цвета в функции. См. этот ответ по связанному вопросу. – wjandrea 29 October 2017 в 05:20

Простая задача - добавить следующую строку перед установкой PS1:

stty columns 1000

Например,

stty columns 1000
PS1='\[\e[0;32m\u@\w/:[\e[m '

, однако это влияет на другие команды unix как ls и man.

0
ответ дан 25 May 2018 в 23:11

У меня была эта проблема при подключении в tmux. Проблема заключалась в том, что у меня была сессия ipython в фоновом режиме (ctrl + z), и это как-то сломало обертку строк. Как только я его прекратил (fg, ctrl+d+d) мой терминал начал нормально работать

Поэтому проверьте любые остановленные интерактивные подсказки.

0
ответ дан 25 May 2018 в 23:11

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

Похожие вопросы: