Подтвердить что ты не робот

Исправить Vim + Tmux yank/paste в неназванный регистр

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

Ошибка:

E353: Nothing in register *

Без tmux vim отлично работает, используя мои текущие настройки. Как его исправить, чтобы я мог использовать y, затем p без ошибок и без указания регистра?

4b9b3361

Ответ 1

Из сообщения об ошибке (Nothing in register *) появляется, что когда вы делаете простой ?p, ваш экземпляр Vim использует * register вместо неназванный регистр *. Вероятно, это связано с тем, что параметр clipboard включает значение unnamed. При настройке этого способа Vim будет использовать регистр * вместо имени ненаписанного регистра для операций yank, delete, change и put по умолчанию (т.е. Если вы не укажете другой регистр с префиксом ", например "ap, чтобы поставить из регистра a).

* Неименованный регистр на самом деле называется " (двойная кавычка). Это только "неназванный" в том смысле, что вам не нужно называть его использовать его (это значение по умолчанию). То есть вам не нужно указывать ""p для записи из неназванного регистра, просто p.

Значение по умолчанию clipboard не содержит unnamed, поэтому оно, вероятно, происходит из некоторой части вашей конфигурации (или плагина). Команда :verbose set clipboard? покажет вам script, который устанавливает текущее значение. Если это выполняется в вашем файле конфигурации, вы можете не делать этого, когда работаете под tmux. Например:

if $TMUX == ''
    set clipboard+=unnamed
endif

В качестве альтернативы может быть некоторый способ разрешить экземплярам Vim-inside-tmux доступ к выбору/буферу графического интерфейса (таким образом, работать с регистром * и/или unnamed в clipboard). Если вы используете Mac OS X, вы можете посмотреть мою обходную оболочку, которая повторно активирует доступ к буфер обмена для процессов, запущенных внутри сеанса tmux. Если вы используете какую-либо другую ОС или графический интерфейс, то вам нужно будет узнать, как Vim обычно разговаривает с графическим интерфейсом и почему он не работает (например, неправильное значение DISPLAY в X11, возможно, из-за присоединения к старому сеансу, который работает оболочка, имеющая устаревшее значение).

Ответ 2

Вот что работает для меня в vim/tmux/osx:

  • Установите Homebrew
  • Установить пространство повторного подключения к пользователю: brew install reattach-to-user-namespace
  • в .vimrc: set clipboard=unnamed
  • Сообщите tmux использовать системный буфер обмена: В .tmux.conf: set-option -g default-command "reattach-to-user-namespace -l bash"

Источник: https://coderwall.com/p/j9wnfw

Ответ 3

Плагин fakeclip делает регистр буфера обмена, как и ожидалось, во многих терминалах и поддерживает tmux/screen. Вы используете его? Он может решить вашу проблему.

Кроме того, вы можете быть заинтересованы в этом совете... Это не применимо к вашему вопросу, но связано. В зависимости от того, какой тип системы/терминала вы используете tmux, вам могут понадобиться некоторые настройки в вашем .tmux.conf. Например, здесь выдержка моего .tmux.conf на OS X (с некоторыми инструкциями в комментариях):

# To use pbcopy and pbpaste on OS X, get this wrapper and install
#    git clone https://github.com/ChrisJohnsen/tmux-MacOSX-pasteboard.git
#    cd tmux-MacOSX-pasteboard/
#    make reattach-to-user-namespace
#    mv reattach-to-user-namespace /usr/local/bin
# After installing, the default command can be reset to use the 'reattach-to-user-namespace' 
# wrapper that was compiled/installed as descripted above.
set -g default-command "reattach-to-user-namespace -l /bin/bash"
# #Next, create Ctrl-c and Ctrl-v mappings
bind C-c run "tmux save-buffer - | reattach-to-user-namespace pbcopy"
bind C-v run "tmux set-buffer $(reattach-to-user-namespace pbpaste); tmux paste-buffer"

Ответ 4

Поздний ответ, но также может быть, что ваш .tmux.conf содержит следующую строку:

set -g set-clipboard off

в сочетании с .vimrc, содержащим

set clipboard=unnamed

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