Я получаю доступ к серверу через ssh, на котором я запускаю vim для редактирования файлов. Когда я пытаюсь вытащить текст из vim в редактор локально на моем mac (lion) либо с y OR "+ y, это не сработает. Я получаю текст, который я скопировал последним локально. Это работает, если я просто использую p внутри vim хорошо.
Vim + COPY + mac через SSH
Ответ 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
.
Затем перейдите в 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
.