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

Vim + COPY + mac через SSH

Я получаю доступ к серверу через ssh, на котором я запускаю vim для редактирования файлов. Когда я пытаюсь вытащить текст из vim в редактор локально на моем mac (lion) либо с y OR "+ y, это не сработает. Я получаю текст, который я скопировал последним локально. Это работает, если я просто использую p внутри vim хорошо.

4b9b3361

Ответ 1

Чтобы расширить ответ на Ray...

Когда вы используете Vim на удаленном сервере через SSH, все, что вы делаете в Vim, выполняется на удаленном сервере. Удаленный сервер и удаленный Vim, которые вы используете на нем, имеют нулевые практические знания вашего локального компьютера и его системного буфера обмена.

Из-за этого y никогда не поместит yanked текст в ваш локальный буфер обмена.

Чтобы скопировать фрагмент текста из удаленного Vim в локальный буфер обмена, у вас есть три варианта:

  • Выберите текст с помощью мыши и нажмите Cmd + C, как в любом приложении Mac OS X.

    Очевидно, что это самый простой, но он имеет как минимум три ограничения:

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

    • Не работает с set mouse=a. С помощью этой опции любая попытка выбрать что-либо с помощью мыши приведет к выбору визуального режима, который нельзя скопировать с помощью Cmd + C. В качестве обходного пути вы можете использовать Alt + мышь, чтобы выбрать текст, не входя в визуальный режим, или просто удалите этот параметр с удаленного устройства ~/.vimrc.

    • Номера строк также копируются.

  • Поместите yanked текст во временный файл, scp его на ваш локальный компьютер и используйте pbcopy, чтобы поместить его в свой буфер обмена.

    Это решение кажется немного запутанным, но оно работает (и сама проблема также немного запутана). За эти годы я видел множество различных реализаций: от простых однолинейных до клиент-серверных настроек. Вот один из, не стесняйтесь google для других.

  • Используйте X-переадресацию, чтобы подключить локальный буфер обмена к удаленному буферу, если он доступен.

Ответ 2

Моим подходящим решением является редактирование файла с помощью vim с вашего локального компьютера через scp.

:e scp://[email protected]//path/to/document

Это сохраняет ваш буфер локальным и позволяет легко копировать в локальный буфер обмена.

Другое преимущество заключается в том, что вы можете использовать локальную настройку vim (настройки .vimrc, плагины и т.д.)

Ответ 3

Если возникла эта проблема - войдите в систему с OSX через SSH в окно Linux и не можете скопировать текст из файла, открытый с помощью vim.

Мое обходное решение :set mouse=i

По умолчанию мышь включена во всех режимах. Когда вы установите его для включения только в режиме Вставки, вы можете прокручивать и копировать, когда вы не редактируете (нормальный режим), но когда вы начинаете редактирование (нажав клавишу я или Insert) и вступая в режим вставки, мышь действует как размещение курсора и вы не можете копировать с терминала.

Вы можете установить эту опцию в ~/.vimrc

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

Ответ 4

Мой первый ответ на stackoverflow, но я чувствую, что это классный (хотя и крошечный) трюк, и он стоит опубликовать. Итак, вот что я делаю:

cat <filename>

Когда текст печатается на терминале, я выбираю весь текст с помощью мыши (прокрутка мыши работает, так как мы находимся в окне терминала). Затем скопируйте этот текст с помощью Cmd + C и вставьте его в свой локальный текстовый редактор.

Единственный недостаток этого трюка заключается в том, что нецелесообразно использовать, если ваши файлы составляют десятки тысяч строк, так как выбор всех линий с помощью мыши будет самоцелью. Но для файла ~ 2k строк он работает хорошо.

Ответ 5

Янки внутри vi в терминале, к которому вы ssh'd копируете строки в внутренний буфер vi на удаленном компьютере, а не в буфер обмена Mac.

Используйте мышь.:)

Ответ 6

Здесь обновлено решение №2 от romainl. Он создает и выполняет псевдоним команды ssh и запускает remotecopyserver, если он не запущен, и устанавливает удаленную копию (rclip) на удаленном сервере. Короче говоря, вам не нужно ничего делать, кроме вставки фрагмента кода ниже в ваш файл bash_profile.

######################## For SSH Remote Copy #########################
export LC_SETUP_RC='command -v rclip >/dev/null 2>&1 || { echo "executing"; mkdir -p /usr/local/bin; if [ ! -f /usr/local/bin/rclip ];then wget https://raw.githubusercontent.com/justone/remotecopy/master/remotecopy -P /usr/local/bin/; ln -s /usr/local/bin/remotecopy /usr/local/bin/rclip; chmod +x /usr/local/bin/remotecopy; fi; if [[ \":\$PATH:\" == *\"/usr/local/bin:\"* ]]; then export PATH=/usr/local/bin:$PATH; fi } > /var/log/rclip.log 2>&1 || echo "Some error occured in setting up rclip. check /var/log/rclip.log"'

ssh_function() {
count="`ps -eaf | grep remotecopyserver | grep -v grep | wc -l`";
if [ "$count" -eq "0" ]; then 
   mkdir -p $HOME/bin;
   if [ ! -f $HOME/bin/remotecopyserver ]; then 
      wget https://raw.githubusercontent.com/justone/remotecopy/master/remotecopyserver -P $HOME/bin;
      chmod +x $HOME/bin/remotecopyserver;
   fi;
   nohup $HOME/bin/remotecopyserver & 
fi;
ssh_cmd=`which ssh`
PARAMS=""
for PARAM in "[email protected]"
do
  PARAMS="${PARAMS} \"${PARAM}\""
done
bash -c "ssh ${PARAMS} -R 12345:localhost:12345 -t 'echo \$LC_SETUP_RC | sudo bash; bash -l'"
}
alias ssho=`which ssh`
alias ssh=ssh_function
alias ssh2=ssh_function

vssh_function() {
ssh_config=`vagrant ssh-config`;
if [ "$?" -eq "1" ]; then
echo "Problem with Vagrant config. run 'vagrant ssh-config' to debug"
return 1
fi
PORT=`echo "$ssh_config" | grep Port | grep -o "[0-9]\+"`; 
ID_FILE=`echo "$ssh_config" | grep IdentityFile | awk '{print $2}'`
ssh2 -q -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no -o PasswordAuthentication=no -i $ID_FILE [email protected] -p $PORT "[email protected]"
}
alias vssh=vssh_function

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

:w !rclip 

чтобы скопировать весь файл в буфер обмена

:'<,'> !rclip

чтобы скопировать выбранные строки из визуального режима. Вы должны нажать "Cmd + V" или "Ctrl + V" всякий раз, когда он запрашивает секретный ключ.

Bonus

Для тех, кто работает с Vagrant, есть обертка vssh, которая будет выполнять бродяжничать ssh, а также запускает и устанавливает необходимые компоненты.

Ссылка

Последний фрагмент кода здесь - https://gist.github.com/ningsuhen/7933b206b92fc57364b2

http://endot.org/2011/12/04/remotecopy-copy-from-remote-terminals-into-your-local-clipboard/

https://github.com/justone/remotecopy

Предостережения

Псевдоним обертывает команду ssh, и могут возникнуть некоторые неожиданные проблемы. ssho доступен, если вам нужно выполнить ssh без всякой вещи remotecopyserver. Кроме того, вы можете использовать псевдоним ssh2 и сохранить команду ssh как есть.

Ответ 7

Одна хитрость, которую я часто использую при копировании текста vim с помощью мыши, если количество строк становится немного перегружено, - это минимизация (Cmd + '-') текста. :) Сведите к минимуму столько, что вы не можете увидеть глазами, но вы можете скопировать весь текст за один раз.

Ответ 8

В MacOS, когда SSH с компьютера A на компьютер B и использование vim на компьютере B, я добавляю это в мой .vimrc на компьютере B:

nmap yr :call system("ssh $machineA_IP pbcopy", @*)<CR>

Таким образом, в обычном режиме, если вы копируете что-то в * register, а затем набираете yr, содержимое * register в vim @machine_B копируется в локальный буфер обмена машины A, при условии, что вы правильно настроили Vim с помощью +clipboard и * register

Ответ 9

Утилиты iTerm2 Shell поставляются с it2copy которая позволяет копировать с удаленного сервера в буфер обмена клиента. Установите утилиты Shell на удаленном сервере и убедитесь, что у Applications in terminal may access clipboard проверенному Applications in terminal may access clipboard. enter image description here

Затем перейдите в visual mode, выделите текст и выполните <,'>:w !it2copy

Ответ 10

Или, с терминала, напишите less [filename], чтобы записать его на терминал. Затем начните выбирать byt с помощью мыши, удерживая клавишу down-arrow -key вниз. Затем вы можете выбрать весь набор.

Ответ 11

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

Когда я использую iTerm2 на Mac, подключаюсь к компьютерам, запускаю tmux, а затем редактирую с помощью Vim, у меня есть окно вертикального разделения iTerm2 на Mac, которое я полностью отодвигаю в сторону, чтобы сделать его максимально тонким.

Затем, когда я захочу скопировать текст из Vim, я нажму на маленький кусочек окна iTerm2, вернусь и выделю, а затем скопирую текст из Vim. Это работает лучше всего для отдельных строк текста.

Если есть вертикальное разделение tmux, выделение нескольких строк в буфере Vim не будет перенесено должным образом и скопирует текст из другого окна tmux, но в противном случае это отлично подходит для копирования 90% того, что мне нужно, без необходимости выходить из Vim, кошка файла, или сделать что-то еще.

У меня также есть достаточно места в горизонтальном окне, поэтому маленькое окно iTerm2 не является космической свиньей.

Ответ 12

Попробуйте другой регистр буфера обмена - "*y.