Конечные пробелы при копировании с консоли

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

Если у Вас уже есть установленный systemd, все, что необходимо сделать, запуститься systemd --user и справьтесь со своими сервисами путем выполнения systemctl --user. Пользовательские сервисы будут разыскиваться в ~/.config/systemd/user.

По умолчанию systemd уничтожит пользовательские сервисы на выход из системы (как Вы запросили). Это поведение может быть изменено путем включения задерживающийся для пользователя с loginctl --enable-linger $USER команда.

Информация о гумусе может быть найдена на странице ArchWiki.

9
26.07.2015, 01:01
7 ответов

У вас будут пробелы в конце строки при выборе и копировании с терминала, если приложение отображало пробелы в этом месте. Приложения могут отображать пробелы, чтобы стереть то, что было раньше. В терминалах есть команды для удаления всей строки или удаления символов справа от курсора; приложения выбирают между этим и отображением пространств в зависимости от того, что они считают наиболее эффективным. Например, если вы вводите что-то в командной строке, а затем нажимаете Backspace, приложение (например, оболочка), скорее всего, перезапишет последний символ пробелом.

Если у вас есть соединение X11, вы можете использовать xsel или xclip , чтобы скопировать файл в локальный буфер обмена.

Экспериментально кажется, что Vim изо всех сил старается не отображать строки, заканчивающиеся пробелами (даже если буфер содержит строку, заканчивающуюся пробелами). Так что копирование оттуда - вариант, если у вас нет соединения X11.

Альтернативой может быть пост-обработка после копирования:

xsel | sed 's/  *$//' | xsel
3
27.01.2020, 20:07

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

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

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

В качестве эксперимента попробуйте следующее:

  • Используйте less , чтобы просмотреть файл, содержащий очень длинные строки, которые переносятся на несколько терминальных строк.
  • Трижды щелкните одну из этих строк (для выделения всей строки). less выбрал всю логическую строку, которая охватывает несколько физических строк, и если вы вставите ее в другое место, она будет сохранена как одна длинная строка.
  • Нажмите j некоторое количество строк, чтобы часть этой длинной строки исчезла в верхней части экрана.
  • Нажмите k один или несколько раз, чтобы прокрутить всю логическую строку обратно в поле зрения.
  • Еще раз трижды щелкните логическую линию. На этот раз выбрана только одна физическая линия.Это связано с тем, что less перекрашивает физическую линию экрана физической линией, и терминал больше не имеет никакого способа узнать, что физические линии были соединены вместе.
  • Теперь, если бы вы вручную перетащили всю логическую строку и вставили ее в другое место, вы бы обнаружили, что в нее встроены символы новой строки.

YMMV в этом эксперименте, потому что ваш терминал (или версия less ) может быть более или менее умен, чем мой.

Как правило, чем тупее программа, создавшая результат, тем выше ваши шансы скопировать и вставить в точности исходный материал. cat , например, настолько тупой, насколько это возможно. (Вы, конечно, понимаете, что «тупой» - это комплимент!)

Если вы получаете дополнительный пробел в конце строки под tmux , вероятно, это потому, что tmux фактически повторяет этот персонаж. Помните, что tmux выполняет собственную эмуляцию терминала, а затем повторно генерирует новые терминальные последовательности для рендеринга на нижележащий терминал. Возможно, он повторяет этот пробел, потому что считает, что в некоторых случаях может возникнуть необходимость перезаписать какой-либо другой символ, который, по его мнению, может там присутствовать. Какой бы ни была причина, терминал, вероятно, не имеет возможности узнать, что символ пробела на самом деле не является частью исходного содержимого.

2
27.01.2020, 20:07

Используя Fedora 17 Linux и окно терминала консоли, я открываю vim с помощью синтастической надстройки vim, мне удалось последовательно воспроизвести эту ошибку. Я помещаю эти три строки Python в vim:

a = "generic assignment"
b = "cursor is on this line"
c = "generic assignment"

Затем я визуально выделяю эти строки и вставляю их сюда:

a = "generic assignment"
b = "cursor is on this line"                                                                                     
c = "generic assignment"

Обратите внимание, как во второй строке скопированы тонны пробелов. Это точно раздражает.

Строки 1 и 3 копируются, как ожидалось, но вторая строка копирует пробелы до самого правого места окна терминала.

Временное решение:

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

Я предполагаю, что причиной этих проблем являются надстройки синтаксиса и цветовой подсветки.

1
27.01.2020, 20:07

На самом деле это несколько вопросов, и ни один из ответов не дает ничего, кроме беглого обзора интересных частей:

  • когда вы выделяете текст с помощью мыши в консоли (это есть, скопируйте его), вставьте и поймите, что у вас есть лишние пробелы в конце каждой строки.
  • Когда я запускаю vim из tmux с TERM = xterm-256color vim, он ведет себя странно.

Большинство терминалов (например, xterm) хранят данные, которые вы можете выбрать на экране. За ним нет скрытой части, которая сообщает терминалу, что приложение предназначено для заполнения фона.

Приложения обновляют экран, перемещая курсор, записывая текст (который может включать фактические пробелы - или табуляции, которые терминал отображает как пробелы) и стирая части экрана.

Стирание - это особая проблема (для выбора / вставки), поскольку многие терминалы (например, xterm) будут заполнить стертую область экрана текущим цветом (функция стирания заднего цвета (bce) в описании терминала). Но в то же время в стертых областях больше не хранятся символы в этих местах экрана. Терминалы, которые используют отображение на экране, позволят вам выбрать все, кроме стертой области. (В качестве особого случая ваш терминал мог стереть области, окруженные текстом, который он будет выдавать за пробелы для выбора).

Все это неприятно, и давным-давно xterm предоставил возможность игнорировать конечные пробелы. Большинство других терминалов этого не предоставляют. И поскольку это вариант, он может не включиться, если вы запустили xterm. Большинство разработчиков терминалов, копирующих функции xterm, не копируют параметры.

Переход к tmux: он не поддерживает функцию bce. Его разработчики решили не делать этого. Таким образом, обычные приложения, работающие в tmux, производят завершающие пробелы. Когда вы переопределяете описание терминала, это сбивает tmux с толку, поскольку он не знает, что vim действительно предполагает, что фон будет очищен с использованием текущего цвета. Вы просто стираете. Без цвета.

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

Дополнительная литература:

  • Поддержка стирания цвета фона (bce) [было: проблема с копированием и вставкой конечного пробела Vim] # 109 (отчет об ошибке tmux)
  • Мой терминал показывает некоторые неокрашенные пробелы ( ncurses FAQ)
  • Проблема с терминалами (полезное обсуждение темы)
  • highlightSelection (руководство xterm)
  • trimSelection (руководство xterm) {{1 }}

    Если вы установите highlightSelection, вы можете увидеть текст, который выделен , включая любые конечные пробелы. Очистка экрана (или строки) сбрасывает его в состояние, не содержащее пробелов. Некоторые строки могут содержать завершающие пробелы, когда приложение записывает их на экран. Однако вы можете не захотеть вставлять строки с конечными пробелами. Если этот ресурс истинен, xterm удалит конечные пробелы из выделенного текста. Он не влияет на пробелы, которые приводят к переносу строки, и не удаляет завершающую новую строку из вашего выделения. По умолчанию это "ложь".

  • Патч № 105 - 1999/6/5 - XFree86 3.9Pp (журнал изменений xterm)

    реализует новый ресурс trimSelection , который позволяет xterm для обрезки конечных пробелов из выбранных строк. Это не влияет на выделение.

  • Патч № 27 - 1996/8/21 - XFree86 3.1.2Ek (журнал изменений xterm ссылается на highlightSelection )

    Этот патч устраняет один из моих давних нареканий: выбор xterm не ясно показывает, что выбирается (согласно запросу Дэвида, он контролируется ресурсом, который по умолчанию соответствует старому поведению).

3
27.01.2020, 20:07

Во многих современных терминальных приложениях есть такие настройки, как «Обрезать конечные пробелы» в параметрах мыши / копирования. Они присутствуют для Konsole (KDE) и Yakuake.

2
27.01.2020, 20:07

Я также использую xterm-256colorи всегда не любил конечные пробелы, когда копирование между терминалами, например, копирование всего файла между двумя удаленными серверами. Мне проще всего просто скопировать весь файл, а затем запустить его в месте назначения:

:%s/\s\+$//g

Это удалит все конечные пробелы из всего файла. Это быстро и просто.

0
27.01.2020, 20:07

xterm-256colorкажется, теперь работает правильно (полные цвета и отсутствие проблем с прорисовкой фона )и имеет функцию BCE (стирания заднего цвета ). Вы можете включить его в tmux, поместив его в свой~/.tmux.conf:

set -g default-terminal "xterm-256color"

-1
27.01.2020, 20:07

Теги

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