Как настроить буфер, используемый VI -Режим Bash для Yank и вставить?

Не уверен, что это все еще актуально для вас, но я опубликую надежное решение для других:

Самый надежный способ, который я нашел, — использовать диски gnome -.

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

Скорее всего, у вас останется большой сектор свободного места после операции, лучше оставить его как есть на тот случай, если он понадобится вам во время установки GuixSD для изменения файла config.scm.

У меня это работает в 100% случаев, нет необходимости использовать какие-либо команды терминала. Диски gnome -, кажется, могут программировать MBR для флешек.

Имейте в виду,это удалит ВСЕ данные на этом диске!

3
29.06.2020, 02:57
1 ответ

После небольшого исследования оказалось, что bash использует для этого внутреннюю переменную, а не любой доступный системный буфер. В руководствах по bash и readline он упоминается как «кольцо уничтожения», а реализацию можно прочитать на GitHub и в других местах. Возможно, можно было бы взломать этот механизм, чтобы вместо этого использовать системный буфер обмена, но мне кажется, что в данный момент это слишком сложно для меня.

Вместо этого я остановился на простом обходном пути ниже, используя встроенную команду bash bind, описанную на страницах руководства для bash (search forbind \[). Он довольно хорошо покрывает мой вариант использования, но не охватывает более сложные убийства и рывки с помощью vim-движений. Пожалуйста, сообщите мне, если вы видите что-то ужасное в моем решении, так как я не имею привычки писать сценарии bash.

В ~/.bashrc:

# Macros to enable yanking, killing and putting to and from the system clipboard in vi-mode. Only supports yanking and killing the whole line.
paste_from_clipboard () {
  local shift=$1

  local head=${READLINE_LINE:0:READLINE_POINT+shift}
  local tail=${READLINE_LINE:READLINE_POINT+shift}

  local paste=$(xclip -out -selection clipboard)
  local paste_len=${#paste}

  READLINE_LINE=${head}${paste}${tail}
  # Place caret before last char of paste (as in vi)
  let READLINE_POINT+=$paste_len+$shift-1
}

yank_line_to_clipboard () {
  echo $READLINE_LINE | xclip -in -selection clipboard
}

kill_line_to_clipboard () {
  yank_line_to_clipboard
  READLINE_LINE=""
}

bind -m vi-command -x '"P": paste_from_clipboard 0'
bind -m vi-command -x '"p": paste_from_clipboard 1'
bind -m vi-command -x '"yy": yank_line_to_clipboard'
bind -m vi-command -x '"dd": kill_line_to_clipboard'

Редактировать1:На привязки "yy" и "dd", использующие два последовательных нажатия клавиш, влияет параметр readline keyseq-timeout. Значение по умолчанию — 500 мс, то есть вам нужно будет ввести второй символ в течение 500 мс после первого. Поэтому, если вы установили keyseq-timeoutна гораздо более низкое значение, у вас могут возникнуть проблемы.

Редактировать 2:Обновлена ​​вставка для более точной имитации поведения vim.

4
18.03.2021, 23:23

Теги

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