Terminal: Ctrl-backspace не возвращает к предыдущему разрыву слова

Созданный на 13 мая 2019  ·  47Комментарии  ·  Источник: microsoft/terminal

Вместо этого он удаляет посимвольно.

Area-TerminalControl Help Wanted Issue-Bug Product-Terminal Resolution-Fix-Committed

Самый полезный комментарий

Исправление для PSReadLine :
Set-PSReadLineKeyHandler -Key Ctrl+h -Function BackwardKillWord

Все 47 Комментарий

Я не вижу привязки клавиш в приложении терминала, возможно, она не реализована.

@kapperchino Более

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

Да.


От: Майк Фрайсингер [email protected]
Отправлено: вторник, 14 мая 2019 г., 14:19:01
Кому: microsoft / Terminal
Копия: Дастин Хоуетт; Автор
Тема: Re: [microsoft / Terminal] Ctrl-backspace не возвращает назад к предыдущему разрыву слова (# 755)

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

-
Вы получаете это, потому что вы являетесь автором темы.
Ответьте на это письмо напрямую, просмотрите его на GitHub https://nam06.safelinks.protection.outlook.com/?url=https%3A%2F%2Fgithub.com%2Fmicrosoft%2FTerminal%2Fissues%2F755%3Femail_source%3Dnotifications%26email_token % 3DADNHLGSJTE4KKXWHDECROFDPVMUELA5CNFSM4HMTV4DKYY3PNVWWK3TUL52HS4DFVREXG43VMVBW63LNMVXHJKTDN5WW2ZLOORPWSZGODVM2FPI% 23issuecomment-492413629 & данные = 01% 7C01% 7Cduhowett% 40microsoft.com% 7C1997e6ff518e4a3f396708d6d8b1c987% 7C72f988bf86f141af91ab2d7cd011db47% 7C1 & SData = V1y3C26WGNZ50VnZW5BhV1CYKetf% 2BgGLqov9Sc9tLw0% 3D & зарезервирован = 0 , или приглушить нить https://nam06.safelinks.protection.outlook.com/? URL = HTTPS% 3A% 2F% 2Fgithub.com% 2Fnotifications% 2Funsubscribe-AUTH% 2FADNHLGQKRNJQTZBZCRAZMO3PVMUELANCNFSM4HMTV4DA & данные = 01% 7C01% 7Cduhowett% 40microsoft.com% 7C1997e6ff518e4a3f396708d6d8b1c987% 7C72f988bf86f141af91ab2d7cd011db47% 7C1 & SData = auF20gJCIvXV% 2FYpDN0e% 2B3JzvxI766ZTbszhk3qx% 2BwUo% 3D & зарезервирован = 0 .

К вашему сведению, если вы запустите PowerShell через WSL, ctrl + backspace также удалит посимвольно, так что это, вероятно, не проблема Терминала.

По-видимому, Ctrl + backspace == <U+0008> == ^H которые большинство оболочек, включая PowerShell, обрабатывают как удаление одного символа, так что это своего рода дизайн? Кроме того, вероятно, поэтому большинство оболочек Linux вместо этого используют Alt + backspace

Да, это может быть вещь PSReadline, TBH. Бьюсь об заклад, они ищут INPUT_RECORD с ctrl + backspace, но, как упоминалось в @ Summon528 , мы отправляем ^H , что большинство эмуляторов терминала отправят для ctrl + backspace.

Затем, когда conpty получит ^H , он переведет это в:
image

в отличие от
image

Это могло бы быть решено с помощью всей вещи conpty INPUT_RECORD

Обычная оболочка PowerShell удаляет до предыдущего разбиения по словам, поэтому я ожидаю, что вкладки PowerShell в Терминале Windows будут делать то же самое.

"Я ожидал"

хорошо, поэтому это ошибка, которая все еще открыта и не решена как By Design

@lzybkr @ daxian-dbw Есть мысли по этому поводу? Обидно, что ctrl+backspace не работает, когда PS Core работает в Терминале Windows. FWIW это также проблема с cmd.exe.

У меня нет решения, но в Windows PSReadLine полагается на CLR для сопоставления INPUT_RECORD с большей точностью, чем то, что вы обычно получаете с терминалами, отличными от Windows. Здесь также делается предположение, связанное с конкретной платформой:

https://github.com/PowerShell/PSReadLine/blob/f2f553156063a8635b9d4882a878a828365cdd99/PSReadLine/Keys.cs#L291

FWIW, вы можете обойти эту проблему, нажав CTRL + SHIFT + LEFT (который выбирает предыдущее слово), а затем нажмите клавишу Backspace. Это далеко не идеально, но это более эффективно, чем возврат через отдельные символы.

Я также хотел бы, чтобы это было исправлено! Определенно резкое изменение от использования обычной оболочки PowerShell.

Чтобы быть ясным, это проблема не только вкладок PowerShell. Первоначально я пришел сюда, чтобы сообщить, что он не работает на вкладках cmd.exe.

Более того, обходной путь CTRL + SHIFT + LEFT не работает на вкладках cmd.exe. Если вы наберете «foo», а затем CTRL + SHIFT_LEFT, тогда курсор просто переместится в начало «foo». Слово не выделяется, поэтому нажатие клавиши Backspace не дает желаемого эффекта.

Я использую zsh в качестве оболочки в WSL. При использовании bindkey '^H' backward-kill-word я получаю ожидаемое поведение.

Это моя конфигурация:

bindkey -e
# Control + backspace
bindkey '^H' backward-kill-word
# Control + arrows
bindkey ";5C" forward-word
bindkey ";5D" backward-word

Я хотел бы отметить по этой проблеме, что почти каждая программа от Microsoft, а также большинство внешних программ используют control + backspace для удаления всего слова, однако по какой-то причине это не встроенная функция Windows, что означает, что каждая из этих программ либо нужно вручную добавить поддержку функциональности, либо их компилятор сделает это за них. Это настолько стандартная функция, что люди, знакомые с горячими клавишами, ожидают ее повсюду. Не было бы разумнее добавить ее как встроенную функцию Windows, чем просто обновлять различные терминалы?

(примечание стороны: explorer.exe также вставляет ascii 127 - удалить символ вместо удаления всего слова)

Немного истории по Ctrl + Backspace: https://devblogs.microsoft.com/oldnewthing/?p=24823

Используйте bind '"\C-H":backward-kill-word' в bash, чтобы решить эту проблему.

Определенно согласен с @ yggdrasil75, что почти каждый текстовый редактор / браузер поддерживает это, наряду с cmd.exe и powershell.exe и даже блокнотом в последних сборках Windows.

Для меня это большой блокиратор, тем более, что я использую powershell, а командлеты / параметры powershell могут быть длинными. Необходимость использовать базовый backspace или выбрать предыдущее слово, а затем backspace слишком сильно нарушает мой рабочий процесс.

Для всех, кто использует autohotkey, я просто хотел сказать, что этот простой макрос позволит вам обойти это, пока он не будет реализован.

#SingleInstance force ; Automatically overwrite any running instance of this script
#Persistent ; If this directive is present anywhere in the script, that script will stay running after the auto-execute section (top part of the script) completes

; For Windows Terminal - deletes the previous word
#IfWinActive ahk_exe WindowsTerminal.exe ; Wait for WindowsTerminal to be active
^backspace::
    Send, ^+{Left}
    Send, {Delete}
return

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

Исправление для PSReadLine :
Set-PSReadLineKeyHandler -Key Ctrl+h -Function BackwardKillWord

Определенно согласен с @ yggdrasil75, что почти каждый текстовый редактор / браузер поддерживает это, наряду с cmd.exe и powershell.exe и даже блокнотом в последних сборках Windows.

Для меня это большой блокиратор, тем более, что я использую powershell, а командлеты / параметры powershell могут быть длинными. Необходимость использовать базовый backspace или выбрать предыдущее слово, а затем backspace слишком сильно нарушает мой рабочий процесс.

Для всех, кто использует autohotkey, я просто хотел сказать, что этот простой макрос позволит вам обойти это, пока он не будет реализован.

#SingleInstance force ; Automatically overwrite any running instance of this script
#Persistent ; If this directive is present anywhere in the script, that script will stay running after the auto-execute section (top part of the script) completes

; For Windows Terminal - deletes the previous word
#IfWinActive ahk_exe WindowsTerminal.exe ; Wait for WindowsTerminal to be active
^backspace::
    Send, ^+{Left}
    Send, {Delete}
return

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

Обязательно отключите контекстную чувствительность с помощью #IfWinActive сразу после этого, если вы используете любые другие горячие клавиши в своем сценарии AHK, в противном случае любые горячие клавиши, определенные ниже, будут применяться только тогда, когда активен ahk_exe WindowsTerminal.exe .

; For Windows Terminal - deletes the previous word
#IfWinActive ahk_exe WindowsTerminal.exe ; only apply to this active window
^backspace::
    Send, ^+{Left}
    Send, {Delete}
return
#IfWinActive ; turns off context sensitivity

Исправление для PSReadLine :
Set-PSReadLineKeyHandler -Key Ctrl+h -Function BackwardKillWord

Спасибо вам большое за это, @paulelms ! Он отлично работает в моих окнах PowerShell / Core, которые я использую чаще всего! Отлично! 🥇

Нам пришлось сделать что-то подобное для терминала vscode.

if ($env:TERM_PROGRAM -eq "vscode") {
    Set-PSReadLineKeyHandler -Chord 'Ctrl+w' -Function BackwardKillWord
    Set-PSReadLineKeyHandler -Chord 'Alt+D' -Function KillWord
    Set-PSReadLineKeyHandler -Chord 'Ctrl+@' -Function MenuComplete    
}

Ctrl + Backspace дал нам Ctrl + w
Ctrl + пробел дали нам Ctrl + @

Я фактически добавил их как привязки клавиш по умолчанию в PSReadLine, поскольку vscode был таким распространенным сценарием.

Может быть, некое согласование с ними (также известное как xterm.js) того стоит?

Нам пришлось сделать что-то подобное для терминала vscode.

if ($env:TERM_PROGRAM -eq "vscode") {
    Set-PSReadLineKeyHandler -Chord 'Ctrl+w' -Function BackwardKillWord
    Set-PSReadLineKeyHandler -Chord 'Alt+D' -Function KillWord
    Set-PSReadLineKeyHandler -Chord 'Ctrl+@' -Function MenuComplete    
}

Ctrl + Backspace дал нам Ctrl + w
Ctrl + пробел дали нам Ctrl + @

Я фактически добавил их как привязки клавиш по умолчанию в PSReadLine, поскольку vscode был таким распространенным сценарием.

Может быть, некое согласование с ними (также известное как xterm.js) того стоит?

мы можем использовать WT_SESSION из # 2256, чтобы понять, находимся ли мы в Терминале Windows.

Я пробовал использовать Терминал. Я не понимал, насколько мне нужно Ctrl + Backspace. Я продержался около 2 часов, и мне пришлось сдаться. Я попробую еще раз, когда это будет решено.

@billgr вы пробовали обходной путь ?

@TylerLeonhardt , не могли бы вы объяснить, как реализовать это обходное решение? Я запустил его в PS, а также в $PROFILE но безуспешно.

@TylerLeonhardt , не могли бы вы объяснить, как реализовать это обходное решение? Я запустил его в PS, а также в $PROFILE но безуспешно.

Предполагая, что у вас установлен psreadline , я добавил этот фрагмент в свой $PROFILE.CurrentUserAllHosts

if ($env:WT_SESSION -ne $null)
{
    Set-PSReadLineKeyHandler -Key Ctrl+h -Function BackwardKillWord
}

Это очень грубое решение, но у меня оно работает :)

@Kralizek , большое спасибо. По некоторым причинам это был сценарий «Это не работает для меня, это работает для вас, и теперь это работает и для меня».

Я рад, что теперь это работает. Но поскольку вы, ребята, уже протестировали это, я уверен, что вы знаете, что это не работает в WSL, верно? И используя:

stty werase ^H

подойдет и для WSL.

@ DHowett-MSFT Я заинтересован в реализации этого и, возможно, Ctrl + Del, пока я занимаюсь этим. Какие-нибудь советы по запуску? Я не копался слишком глубоко в части VirtualTerminal WT.

@mkitzan конечно! Вот части, на которые вы захотите взглянуть.

  • VirtualTerminalInput - используется в Cascadia (всегда), чтобы определить, какой VT генерировать для данного нажатия клавиши
  • ГРАНИЦА ПРОЦЕССА CONPTY (не исследуйте это, я просто был неумелым с моим макетом списка)
  • InputStateMachineEngine - используется в Conhost (здесь, при размещении сообщения), чтобы определить, в какие ключевые события преобразуется данный фрагмент VT.
  • VirtualTerminalInput - используется в Conhost (если приложение запросило ввод VT), чтобы определить, какой VT генерировать для данного синтезированного нажатия клавиши: smile:

Вам нужно позаботиться о том, как VirtualTerminalInput используется от 0 до 2 раз для каждого заданного фрагмента ввода нестандартных символов.

Отлично, я займусь этим. Благодарю.

Обновление: ESC\0x8 делает то, что мы хотим в WSL, но не в PS или CMD. Ctrl + Del работает правильно из коробки в PS, но не в WSL или CMD. Все еще в стадии разработки ⛑.
Для опытных пользователей WSL (со сборкой разработчика) в потоке, ищущем быстрое исправление, замените L"\x8" на L"\x1b\x8" . Для тех, кто создает предварительную версию WSL, Alt + Ctrl + Backspace сделает то, что вы хотите, из коробки (и так неоптимально).
Фактические кадры достижения границы конфликта во время трассировки кода.
conpty-boundary

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

Решения PSReadLine и AHK хороши, но я не думаю, что есть возможность реализовать это с помощью ярлыка profiles.json? (т.е.
"command": "something", "keys": [ "ctrl+backspace" ]

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

через ярлык profiles.json

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

Наш единственный вариант - убедиться, что мы можем пройти через Ctrl + Backspace так, как это может понять удаленная оболочка.

Получил одно сообщение для всех хороших людей в цепочке
we-got-him

@ zadjii-msft ваш комментарий был очень полезным. По сути, просто нужно переосмыслить, как InputStateMachine обрабатывает \b как управляющий символ. У меня также есть небольшие исправления двух других проблем в моей рабочей ветке. Вы не возражаете, если я сделаю один PR, включающий все три исправления, или вы бы предпочли отдельные PR для каждого?

: tada: Эта проблема устранена в # 3935, который теперь успешно выпущен как Windows Terminal Preview v0.8.10261.0 .: tada:

Полезные ссылки:

Эта проблема до сих пор не решена в терминалах WSL1. Ctrl + Backspace не работает в обычном терминале WSL1 без команды bind, представленной ранее в этом потоке.
Я что-то делаю не так или это все еще работает не на всех терминалах?

@Nufflee, даже эта bind больше не обязательно работает в wsl1. Он работает на одной машине, но не работает на других. Тот, который сейчас работает на всех моих машинах, выглядит так: stty werase ^H

спасибо @jevring , это работает для моего bash

Я не понимаю ... ctrl + backspace не удаляет слово через ssh в "Windows Terminal" (бета).
Эта функция работает, если я использую окно терминала через виртуальную машину Linux. Фактически, Ctrl + BS работает во всех окнах в Linux env., Вне зависимости от того, удален ли я удаленно или локально. Это довольно универсальная привязка клавиш в Linux.

Но для Windows Terminal - Ctrl + BS, Shift + BS, Ctrl + Shift + BS, Ctrl + Alt + BS, Alt + BS и т. Д. - всевозможные комбинации - ни хрена.

Есть ли способ сказать: «Когда я использую ssh - перестаньте меня продавать»? Или же ???

Люди упоминают «сейчас работает», но при нулевых обстоятельствах это работает.

Что мне не хватает?

@ lucky-wolf, какую версию клиента SSH вы используете? В той, которая шла с Windows, 7.7, есть некоторые ошибки ввода, которые приводят к тому, что некоторые ключи отбрасываются, даже когда «Windows Terminal» их отправляет.

Мы проработали это с их командой, и версии 8.1 и выше должны поддерживать все, что делает Терминал.

Если вы используете WSL и внутри него запускаете SSH, было бы очень полезно, если бы вы указали _ новую_ ошибку, потому что это неожиданное и нежелательное поведение.

Хорошо, теперь, когда я на своей машине, я могу продемонстрировать это немного лучше. Я использовал служебную программу showkey (часть пакета kbd в Ubuntu и Debian) для записи кодировки Ctrl + Backspace .

ssh под wsl

% wsl ssh -4 dustin<strong i="10">@antares</strong> -t showkey -a

Press any keys - Ctrl-D will terminate this program

^H        8 0010 0x08
^D        4 0004 0x04
Connection to antares closed.

ssh 7.7 (win32-openssh, поставляется с windows)

% ssh -V
OpenSSH_for_Windows_7.7p1, LibreSSL 2.6.5

% ssh dustin<strong i="14">@antares</strong> -t showkey -a

Press any keys - Ctrl-D will terminate this program

^?      127 0177 0x7f
^D        4 0004 0x04
Connection to antares closed.

ssh 8.1 (win32-openssh, более новая версия из их репозитория )

% ssh8 -V
OpenSSH_for_Windows_8.1p1, LibreSSL 2.6.5

% ssh8 dustin<strong i="19">@antares</strong> -t showkey -a

Press any keys - Ctrl-D will terminate this program

^H        8 0010 0x08
^D        4 0004 0x04
Connection to antares closed.

^H - правильная кодировка, а ^? - нет. Win32-OpenSSH до версии 8+ не доверял инфраструктуре консоли Windows для генерации правильных кодировок символов. Он сделал бы https://github.com/PowerShell/openssh-portable/pull/412.

Извинения. Я не на 100% уверен, что попал в нужное место? Я использую win 10, использую приложение "Windows Terminal" 1.1.2021.0.

Я установил это, когда пытался найти достойную оболочку - и хотел что-то, что могло бы обрабатывать PS, а также WSL (который я установил в то время). С тех пор я удалил WSL, который показался мне громоздким, но я пытался просто использовать этот терминал Windows в качестве надежного интерфейса удаленной оболочки - кажется, он поддерживает раскрашивание bash / zsh через ssh для различных ящиков Linux, которые мы используем на работе.

И по большей части мне это очень понравилось - за одним исключением: ctrl + backspace не удаляет слово. Из-за разочарования я выполнил простой поиск в Windows Terminal и Ctrl + BS не работал, и приземлился здесь, и многие люди указали, что он отлично работает.

Итак, есть ли другой терминал Windows? Я неправильно использую Терминал Windows (я начинаю с Power Shell 5.1.18362.752., А затем запускаю ssh оттуда ... может быть, есть лучшая базовая оболочка для начала?)

Я вижу, что есть гораздо более поздние версии PS, поэтому сейчас я обновлюсь до 7.03. Могу я переустановить WSL, если он работает лучше?
Меня не очень интересует PS для какой-либо локальной работы - хотя я не возражаю немного узнать о новой оболочке - но 98% из того, что мне нужно, - это надежный гибкий терминал для ssh в различных ящиках Linux для выполнения базовой настройки / сбор журнала / устранение неполадок -

И отсутствие ctrl + backspace просто делает набор текста намного сложнее, чем он должен быть (когда остальная часть терминала довольно хороша).

И хм ... да - бегу:
ssh -v
OpenSSH_for_Windows_7.7p1, LibreSSL 2.6.5

Похоже, это моя вторая половина проблемы!

Простите за то, что был таким нубом. Похоже, мне нужна помощь, @DHowett ! Очень признателен!


Обновить:

Я обновился до Power Shell 7.03
Обновлено до OpenSSH_for_Windows_8.1p1, LibreSSL 2.9.2
но когда я использую ssh8 в своем Linux-окне, ctrl + bs не выполняет удаление слов.

Если я сделаю то же самое с моей виртуальной машины Mint, используя собственный терминал и реализацию ssh, ctrl + bs будет работать.

так что я все еще не понимаю, как это сделать? : /

После открытия ssh-соединения мне пришлось выполнить следующую команду, чтобы заставить Ctrl + Backspace работать на моих виртуальных машинах Linux:

stty werase ^h

Обратите внимание, что я использую последнюю версию Windows Terminal Preview и OpenSSH 8.1. Кстати, хотя это работает в оболочке bash , в которую вы запускаете ssh, после запуска pwsh на удаленном компьютере Ctrl+Backspace возвращается к удалению одиночных символов. Я попробовал команду stty в PowerShell, без радости.

@ DHowett-MSFT
почему это закрыто? Это все еще происходит, по крайней мере, в bash. В powershell и cmd у меня все работает нормально.

Терминалы на основе WSL не удаляют целые слова с помощью Ctrl + Backspace

WSL не интерпретирует последовательность виртуальных клавиш Ctrl + Backspace как «удалить все слово» по какой-либо причине (не уверен насчет WSL2). Если вы откроете любой старый терминал на основе WSL (например, оболочку Ubuntu из магазина MS), Ctrl + Backspace не удалит целые слова по этой причине. Если вы хотите удалить целые слова в терминале на основе WSL, Ctrl + W сделает это. Ctrl + Backspace работает с CMD и PS, потому что они обрабатывают последовательность виртуальных клавиш должным образом.

(читайте ветку / пиар, там все есть)

Была ли эта страница полезной?
0 / 5 - 0 рейтинги