2

Эта проблема

Я работал исключительно в Windows. Я могу справиться с этим.

Я работал исключительно в DOS (давно!). Я могу справиться с этим.

Я работал исключительно в Unix. Я могу справиться с этим.

Сейчас я занимаюсь разработкой приложения для командной строки (python) на компьютере с Windows, тестирую его в окне DOS (то есть в командной строке Windows), а затем развертываю в Linux и запускаю с PuTTY.

Я не могу справиться с этим.

Моя производительность резко падает, когда CTRL-C врезается в одно окно (Windows) и убивает процесс в другом (DOS, Linux).

Моя производительность резко падает, когда Enter копирует выделение в одном окне (DOS), удаляет выделение в другом (Windows) и запускает текущую половинную команду в третьем (PuTTY).

Моя производительность резко падает, когда я не могу нажать Отменить, Домой или Конец.

Решение, которое я ищу

Клиент командной строки SSH/Bash, работающий в Windows и, по мере возможности, использующий все стандартные сочетания клавиш Windows («Вырезать», «Копировать», «Вставить», «Отменить», «Домой», «Конец», «Вставить», «Shift» и т.д.), Работает над командная строка bash. Бонусные баллы, если он ставит курсор между буквами, а не на них. Кроме того, эквивалентная выпадающая строка командной строки DOS, которая работает в Windows и обеспечивает тот же интерфейс.

Я понимаю, что могут понадобиться специальные кнопки для фактической передачи кодов CTRL (например, CTRL-C) в тех случаях, когда они мне нужны.

Я подозреваю, что SSH-клиент должен быть специфичным для оболочки (поэтому он знает, когда он находится в командной строке и когда он находится внутри работающего приложения).

Я знаю, что есть много клиентов SSH, но я ищу совет для конкретной потребности. PuTTY выглядит как выход из положения для программистов Unix, застрявших в Windows. Я наоборот.

Кто-нибудь может порекомендовать один (или, возможно, сочетание SSH-клиента и замены из командной строки)?

Обновление: увидев ранние ответы здесь, я превратил свои требования в статью в блоге, которая может дать больше информации в том направлении, в котором я ищу.

4 ответа4

2

для работы с терминалом я использую mintty , который можно использовать как часть пакета cygwin . тогда я, очевидно, запускаю "настоящую" оболочку (в моем случае zsh), хотя powershell не так уж и плох (плохая часть - это то, что предоставляет терминал Windows. Это ужасно).

  • вы можете запустить cmd.exe изнутри bash/zsh
  • у вас есть SSH в Cygwin
  • Вы можете изменить способ, которым курсор выглядит в мятном (так что он выглядит как | вместо блока)
  • Вы можете пометить текст так же, как в xterm, и с помощью ctrl+leftclick вы можете запустить соответствующее приложение на этом помеченном тексте (допустим, вы отметили http://superuser.com и ctrl+leftclick -> браузер запускается, если вы выбрали C:\Windows запускается проводник и т.д.)

единственный другой способ сделать это - разработать непосредственно на удаленном сервере через ssh-сессию, используя приличный редактор (vim приходит на ум).

1

Это сложно из-за соглашений Unix и разделения обязанностей по обработке ввода между терминалом, драйвером терминала и оболочкой. Но есть некоторые вещи, которые вы можете сделать.

Как уже указывалось, используя mintty, Ctrl+Insert и Shift+Insert копируют и вставляют из буфера обмена Windows. Терминал не может вырезать, потому что он не контролирует строковый буфер оболочки. Эти ярлыки были получены из стандарта IBM Common User Access (CUA). Они впервые появились в приложениях DOS и были в Windows с самого начала.

Ctrl+X/C/V, тем временем, пришел с Mac. Возможно, это более удобно, но большая проблема с использованием их в терминале, конечно, заключается в том, что Ctrl+C является ключом прерывания, и многие приложения используют его и для таких вещей, как Cancel. Кроме того, Ctrl+V является стандартной клавишей для «цитирования-вставки» в оболочке, которая удаляет любое специальное значение из следующего нажатия клавиши, а Ctrl+X является первой клавишей для многих двухэтапных сочетаний клавиш.

Я не думаю, что есть какой-либо способ использовать Shift+ стрелка для маркировки текста в Bash. Вместо этого вы нажимаете Ctrl+ Пробел, чтобы установить "отметку", а затем, если вы перемещаете курсор, выделяется текст между отметкой и курсором. К сожалению, вы на самом деле не видите выбор (называемый "регион"), поэтому вы должны помнить, где вы поставили отметку.

(Zsh работает так же, но в отличие от bash он выделяет выделение. В выпуске 84 для mintty добавлена возможность выбора текста с помощью клавиатуры на уровне терминала. Такая функция, скорее всего, будет использовать Shift+ стрелка.)

Теперь ярлыки по умолчанию для работы в "регионе" - это emacs, но вы можете изменить их на стиль Mac, поместив следующее в файл с именем .inputrc в вашем домашнем каталоге. (Читайте все о .inputrc на http://www.gnu.org/software/bash/manual/bashref.html#Readline-Init-File)

"\C-x": kill-region
"\C-c": copy-region-as-kill
"\C-v": yank

Но подождите, а как насчет особого значения этих клавиш? Ну, вы только что потеряли все двухэтапные сочетания клавиш Ctrl+X, так что вам придется заново связать те, которые вам действительно нужны. Между тем, функция Ctrl+V может перейти в Ctrl+Q:

"\C-q": quoted-insert

Это оставляет все важные Ctrl+C. Это на самом деле обрабатывается драйвером терминала, поэтому вам нужно переместить его куда-нибудь еще, используя 'stty'. Mintty имеет управляющую последовательность, которая позволяет изменять код клавиши Escape таким образом, чтобы его можно было использовать в качестве ключа прерывания. Поместите это в ваш скрипт запуска bash:

echo $'\e[7728h'
stty intr ^\

Коды клавиш Mintty для различных специальных клавиш также позволяют изменить некоторые другие параметры stty на стиль Windows:

  • swtch ^] susp ^] - Пауза вместо Ctrl+Z для сна процесса
  • eof ^^ - Ctrl+Enter вместо Ctrl+D для конца файла
  • werase ^_ - Ctrl+Backspace вместо Ctrl+W для удаления слова
  • lnext ^q - Ctrl+Q вместо Ctrl+V для вставки букв следующего символа

Вы также можете удалить ярлыки драйвера терминала для остановки (^ S) и запуска (^ Q) вывода, которые на самом деле не очень полезны, но которые вполне могут вызвать путаницу:

stty start - stop -

Вернемся к .inputrc, здесь есть несколько привязок клавиш в стиле Windows:

# Ctrl+Left/Right to move by whole words
"\e[1;5C": forward-word
"\e[1;5D": backward-word

# Ctrl+Backspace/Delete to delete whole words
"\e[3;5~": kill-word
"\C-_": backward-kill-word

# Ctrl+Shift+Backspace/Delete to delete to start/end of the line
"\e[3;6~": kill-line
"\xC2\x9F": backward-kill-line

# Alt-Backspace and Ctrl+Z for undo
"\e\d": undo
"\C-z":undo

Наконец, вы также можете найти следующие сочетания клавиш полезными. Они ищут строку в истории, которая начинается так же, как ваша текущая:

# Ctrl-Up/Down for searching command history
"\e[1;5A": history-search-backward
"\e[1;5B": history-search-forward
0

хорошо, еще один способ решения вашей проблемы:

редактируя файлы, вы должны отредактировать их в локальном редакторе и, записав их на "диск", перенести их обратно на сервер.

опции:

  • vim может сделать это через плагин netrw (который сейчас является частью стандартного дистрибутива, iirc)
  • Emacs, кажется, поддерживает это с помощью tramp, но у него также есть небольшие проблемы.
  • настроить ssh-туннель на общий ресурс samba на удаленной машине, чтобы монтировать его локально
  • попробуйте экспандрайв ("монтирует sftp в ваш проводник")
  • попробуйте sshfs для windows через dokan-sshfs.
0

Я думаю, что Cygwin делает то, что вы хотите ... но я не использовал его в течение нескольких лет. Я на самом деле установлю его прямо сейчас, чтобы посмотреть, как оно выглядит. Это несколько излишне использовать только для ssh-клиента.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .