2009-06-15 5 views
12

В моем .zshrc я использую следующий фрагмент, чтобы интегрировать буфер обмена оболочки и мой основной буфер обмена X11. Благодаря этой интеграции я могу вырезать и вставлять текст в emacs, firefox и на терминал, без необходимости использовать мышь.Интеграция kill-ring readline и буфера обмена X11

kill-line() { zle .kill-line ; echo -n $CUTBUFFER | xclip -i } 
zle -N kill-line # bound on C-k 

yank() { LBUFFER=$LBUFFER$(xclip -o) } 
zle -N yank # bound on C-y 

Примечание: Я использую этот трюк на Mac OS X, а также (с pbcopy/pbpaste вместо Xclip) и благодаря Synergy двух моих компьютеров используют один буфер обмена. Ухоженная. Но это не работает с readline. И я часто использую readline, например, в (i) python, в gdb, в ncftp ...

Итак, вот мой вопрос: есть способ интегрировать буфер обмена readline с остальной частью -мир ?

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

+0

Я не уверен, что ты действительно хочу здесь, но я нашел еще один инструмент, такой как xclip XSEL - http://www.vergenet.net/~conrad/software/xsel/, который кажется более мощным – jitter

+0

Спасибо за обмен. На самом деле, то, что мне нужно, это способ вызвать программу, такую ​​как XSEL, автоматически из программ readline (например, bash), когда я нажимаю Ctrl-K/Ctrl-Y. Я предполагаю, что это сводится к привязке команды оболочки к комбинациям клавиш для чтения ... – Gyom

+0

Я предлагаю вам изменить свой 'echo -n' на' print -rn --' (или 'printf% s') выше –

ответ

5

Лично я запускаю все внутри GNU screen. Это дает мне множество функций во всех терминальных программах, а не только на основе readline. У этого есть свой собственный буфер (-ы) вставки, которые распределяются между всеми экранами в текущем сеансе и могут читать/записывать файл обмена (настраиваемый с bufferfile).

  • Выбор экран выполнен с Ctrl + , [, < движение >, Космический, < движение >;
  • Скопировано в буфер для пасты с Введите;
  • вставили с Ctrl + , ];
  • заменяется содержимым файла обмена с Ctrl + , <;
  • и выписал файл обмен с Ctrl + , >.

Затем все, что вам нужно, это маленькие помощники для синхронизации /tmp/screen-exchange и выбора X. Что-то простое, как это сработает.

# ~/.screenrc (or entered at C-a : command prompt) 
bind '{' exec sh -c 'xclip -o>~/.screen_exchange' 
bind '}' exec sh -c 'xclip -i ~/.screen_exchange' 

Конечно некоторые приятнее привязок и макросы бы сделать жизнь проще (это требует C-a { C-a < C-a ], чтобы вставить выбор X в терминал), но это полностью зависит от вас.

11

Bash 4.0 вводит некоторые новые функциональные возможности:

NEWS

команда, назначенная ключевой последовательности с ` bind -x 'теперь устанавливает два новых переменных в среде выполнения команды: READLINE_LINE_BUFFER и READLINE_POINT. Команда может изменить текущую линию readline и положение курсора, изменив READLINE_LINE_BUFFER и READLINE_POINT, соответственно.

Файл NEWS кажется неточным; READLINE_LINE (no _BUFFER) - это то, что описано в других местах и ​​фактически работает.

Ниже будет имитировать поведение Bash Существующий Ctrl + (U | K | Y), но влияющие на выбор X, хотя я использую Meta/Esc, потому что я не» t как перезаписывать существующие функции.

_xdiscard() { 
    echo -n "${READLINE_LINE:0:$READLINE_POINT}" | xclip 
    READLINE_LINE="${READLINE_LINE:$READLINE_POINT}" 
    READLINE_POINT=0 
} 
_xkill() { 
    echo -n "${READLINE_LINE:$READLINE_POINT}" | xclip 
    READLINE_LINE="${READLINE_LINE:0:$READLINE_POINT}" 
} 
_xyank() { 
    READLINE_LINE="${READLINE_LINE:0:$READLINE_POINT}$(xclip -o)${READLINE_LINE:$READLINE_POINT}" 
} 
bind -m emacs -x '"\eu": _xdiscard' 
bind -m emacs -x '"\ek": _xkill' 
bind -m emacs -x '"\ey": _xyank' 

Я до сих пор нравится больше screen, но это лучше отвечает на ваш вопрос — до тех пор, как только Readline приложения вы заботитесь о Bash.

+0

; это действительно то, что я хотел.К сожалению, я использую zsh в качестве оболочки, поэтому, когда я использую readline, это часто с другими программами, чем bash :-) Думаю, мне придется привыкнуть к экрану. – Gyom

+1

это не работает для меня в bash 4.2.37. Эти переменные фактически не содержат никакой ценности. – Forethinker

+0

Я проголосовал за этот ответ и модификацию пользователя @ Wei_Hu ниже. Смотрите там. – user1404316

4

Я хотел бы предложить функцию следующих _xyank() на основе ответа ephemient в:

_xyank() { 
    CLIP=$(xclip -o) 
    COUNT=$(echo -n "$CLIP" | wc -c) 
    READLINE_LINE="${READLINE_LINE:0:$READLINE_POINT}${CLIP}${READLINE_LINE:$READLINE_POINT}" 
    READLINE_POINT=$(($READLINE_POINT + $COUNT)) 
} 

Что это делает, чтобы переместить курсор в конец скопированного текста, что делает его более совместимым с другими встроенными команды.

+0

спасибо, но опять же, мой вопрос касался не-bash readline приложений :-) – Gyom

0

Как я писал here, я обнаружил, что для заполнения буфера обмена X может быть приятнее иметь отдельные привязки клавиш, это связано с тем, что я часто использую «убить» для обработки текста в Readline, и я не хочу, чтобы это уничтожило буфер обмена каждый раз.

Когда Readline когда-либо получает возможность иметь привязки клавиш, которые вызывают взаимодействие с X, я рекомендую привязать^Xw и^Xy для копирования и вставки.

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

Что касается расширения Readline с возможностью связывать ключи команд, я принес его в списке рассылки Readline, мы увидим, что говорит Чет:

https://lists.gnu.org/archive/html/bug-readline/2016-05/msg00002.html

 Смежные вопросы

  • Нет связанных вопросов^_^