In all GUI text editors, web browsers and IDE’s you can move a cursor:

  • left/right arrows - move by char;
  • ctrl+left/right - move by word;
  • home/end - move to start/end of line.

Add Shift to any of above combination and everything you jumped through now is selected and you can: Ctrl+C, Ctrl+X,Delete to copy/cut/delete selection.

Also, you can Ctrl+Delete and Ctrl+Backspace to delete a next/previous word.

Also, you can Ctrl+Home/End to jump to start of first line or end of last line.

I want this to work when I type in a command in my Terminal.

Is it possible in Linux? It’s a vanilla experience in Windows+Powershell, thanks to default PSReadlLine extension. It works both in conhost.exe and in Windows Terminal, but doesn’t work in WT + cmd.exe, which makes me think it’s PSReadLine which is responsible for this technological perfection.

“But you can’t copy with Ctrl+C, it’s…” - You can. When something is selected It copies selection to clipboard, otherwise it sends SIGINT.

I’m not bound to any distro or terminal application, but right now I don’t see these incredible text editing techniques working even in Ubuntu+Powershell+PSReadLine, to say nothing about the Bash. I’ve tried installing WezTerm, but it doesn’t have text selection either, at least by default. And I’m inclined to think it has nothing to do with terminal emulators at all, since it works in conhost.exe+Powershell.

  • podbrushkin@mander.xyzOP
    link
    fedilink
    English
    arrow-up
    9
    ·
    edit-2
    4 months ago

    I’ve got what I wanted with wezterm + powershell. I can edit my commands the same way I edit any text anywhere in the system, both in Windows and Linux, and I can copy-paste back and forth between terminal and any other app. This is awesome. This is freedom. This is UX done right.

    I will paste below some observations I’ve made.

    Possible solutions for Bash

    Blesh

    https://github.com/akinomyoga/ble.sh/wiki/Manual-§4-Editing

    • Super simple installation.
    • Home/End - Jump to start/end as expected. ✅
    • Ctrl+Backspace removes left char instead of left word. ❌
    • Ctrl+Delete removes next word as it should. ✅
    • Shift+arrows - char-wise text selection ✅
    • Shift+Ctrl+arrows - word-wise text selection ✅
    • Shift+Home/End don’t do anything. ❌
    • Backspace/Delete: When smth is selected they delete it. ✅
    • Copy/Paste/Cut: ❌
      • It’s Alt+W/Ctrl+Y/Ctrl+W instead of Ctrl+C/Ctrl+V/Ctrl+X.
      • All work with selection as expected.
      • All work with internal buffer instead of system clipboard.
    • System clipboard:
      • Can’t copy selection to clipboard, can’t paste clipboard into selection.
      • Ctrl+Shift+C/V work as they do in vanilla bash: copy what is selected with mouse to clipboard, paste from clipboard.
    • Ctrl+C prints current command and starts new one like in vanilla bash.

    zsh-shift-select

    • Stated to have best compatibiliy with Alacritty.
      • Alacritty requires Cargo (440MB).
        • cannot install package alacritty 0.16.1, it requires rustc 1.85.0 or newer, while the currently active rustc version is 1.75.0 Fail. Will use Gnome Terminal instead.
    • Needs zsh, super simple installation.
      • Zsh should be default shell, gnome-shell crashed with SIGSEGV.
      • Plugin itself has simple installation, just git clone .zsh file and source it in .zshrc
    • Ctrl+arrows - prints CD instead of moving word-wise ❌
    • Ctrl+Backspace, Ctrl+Delete - are not deleting left/right word ❌
    • Home/End - Jump to start/end as expected. ✅
    • Shift+Left/Right - char-wise text selection ✅
    • Shift+Ctrl+arrows - word-wise text selection ✅
    • Shift+Home/End don’t do anything. ❌
    • Shift+Up/Down - Select one line up/down ✅
    • Backspace/Delete - When smth is selected - delete it. ✅
    • Copy/Paste/Cut: ❌
      • Documented as Alt+W/Ctrl+Y/Ctrl+W instead of Ctrl+C/Ctrl+V/Ctrl+X.
      • Alt+W/Ctrl+Y work as copy/paste.
      • Ctrl+W removes previous word instead of Cut selection.
      • Work with internal buffer instead of system clipboard.
    • System clipboard:
      • Ctrl+Shift+C/V work as they do in blesh and vanilla bash.
      • Can’t copy selection to clipboard, can’t paste clipboard into selection.
    • Ctrl+C prints current command and starts new one like in vanilla bash.

    wezterm + Powershell

    PSReadLine starts with EditMode = Emacs by default.

    Set-PSReadLineOption -EditMode Windows Fixes Ctrl+arrows, Ctrl+backspace, Shift+Ctrl+arrows.

    Set-PSReadLineKeyHandler -Chord Ctrl+Delete -Function KillWord - Fixes Ctrl+Delete.

    Set-PSReadLineKeyHandler -Chord Ctrl+o -Function AddLine - allows Ctrl+o instead of Shift+Enter to create a new line without trying to execute. Shift+Enter is not possible in Linux.

    Reassigning Shift+Home/End in Gnome Terminal from scrolling viewport to something else is a rabbit hole, so I switched to wezterm, which fixed Shift+Home/End, and apparently also fixed a bug of Shift+arrows printing D;D;D; instead of selecting. But broke Shift+Ctrl+arrows. But you can fix it back by disabling this assignment in lua config.

    Ctrl+C/V/X work fine, but without system clipboard synchronization. To fix it, install xclip. If it makes terminal freeze on Ctrl+C/X, update PSReadLine module.

    • Ctrl+arrows ✅
    • Ctrl+Backspace, Ctrl+Delete ✅
    • Home/End ✅
    • Shift+Left/Right ✅
    • Shift+Ctrl+arrows ✅
    • Shift+Home/End ✅
    • Shift+Up/Down ❌
    • Shift+Enter - Ctrl+o instead ✅
    • Ctrl+C,Ctrl+V,Ctrl+X - Flawless ✅

    Fedora KDE

    By default it has Konsole terminal, it doesn’t send Shift+Left/Right to shell (try showkey -a). These terminals don’t fit because they don’t send this chord: Konsole, QTerminal, Yakuake. And Wezterm doesn’t support Fedora 43. Then I’ve tried Kitty and it works both in bash and Powershell. Therefore, Wezterm for Ubuntu+Gnome and Kitty for Fedora+KDE.

    Windows + conhost + Powershell Core

    PSReadLine starts with EditMode = Windows by default.

    • Ctrl+arrows ✅
    • Ctrl+Backspace, Ctrl+Delete ✅
    • Home/End ✅
    • Shift+Left/Right ✅
    • Shift+Ctrl+arrows ✅
    • Shift+Home/End ✅
    • Shift+Up/Down ❌
    • Shift+Enter ✅
    • Esc - clear current command ✅
    • Ctrl+C,Ctrl+V,Ctrl+X - Flawless, all with system clipboard. ✅
    • Alaknár@sopuli.xyz
      link
      fedilink
      English
      arrow-up
      1
      ·
      6 months ago

      Please keep at it! I’ve been looking for a while and I’m shocked how difficult such a seemingly simple thing is to get on Linux…

      • podbrushkin@mander.xyzOP
        link
        fedilink
        English
        arrow-up
        2
        ·
        6 months ago

        I’ve got what I wanted, but I’m a powershell user. For Bash, blesh looks very promising - it’s functionally same component as PSReadLine which makes all this stuff possible in pwsh.

      • podbrushkin@mander.xyzOP
        link
        fedilink
        English
        arrow-up
        1
        ·
        6 months ago

        For Bash - try blesh, it will enable some of common controls by default, and probably you will be able to manually enable other shortcuts. PSReadLine is calling xclip each time for copy/paste action for clipboard sync, probably it will be possible with Blesh too.

  • felsiq@piefed.zip
    link
    fedilink
    English
    arrow-up
    5
    ·
    6 months ago

    I have everything you mentioned (except maybe the selection only stuff, I don’t use it and forget if I set it up at all) set up in my zsh+kitty setup, so it’s definitely possible. If you want I can dig thru my zshrc and kitty config for the relevant parts once I’m at my pc later.

    People in here saying it’s a bad idea for things like compatibility with other shells make some good points, but I think they’re missing one important aspect - fuck other shells, what do I care? 95% of my time in the terminal is spent on my own machine and I may as well make it convenient for myself. The odd time I ssh into another box without my keybinds I’ll be a bit less efficient, but that’s a worthwhile trade off imo.

    • podbrushkin@mander.xyzOP
      link
      fedilink
      arrow-up
      1
      arrow-down
      2
      ·
      6 months ago

      In Gnome Terminal: Ctrl+arrows work, Ctrl+delete work, home/end work, Ctrl+backspace — not, and there is no text selection, of course. So, something is working as expected without config at all, and for what isn’t working, config will not help.

  • TurboWafflz@lemmy.world
    link
    fedilink
    arrow-up
    5
    arrow-down
    1
    ·
    6 months ago

    I think if we want something like that to be consistent everywhere we need to stop using Ctrl so much as a modifier for non-terminal tasks. It doesn’t solve everything, but using Alt or Super for copy and paste like Haiku and MacOS do is a big step in the right direction. It’s just hard to change an established custom without making the whole experience less consistent

    • podbrushkin@mander.xyzOP
      link
      fedilink
      arrow-up
      5
      ·
      6 months ago

      It’s nice to see you think of it as of movement towards consistency. I also look at it this way.

      But what is it about Ctrl? Text editing is historically the main task of computers, and Ctrl is the main “modifier” key. To me it seems fair it’s dedicated for some text editing shortcuts. Probably they are consistent since 1980’s.

      • pr06lefs@lemmy.ml
        link
        fedilink
        arrow-up
        10
        arrow-down
        2
        ·
        6 months ago

        but ctrl-c to cancel terminal tasks predates the 1980s. the inconsistency came in when apple decided to ignore that precedent and introduce ctrl-c, ctrl-x, and ctrl-v as shortcuts in their graphical UI.

        to achieve consistency, probably better to invent a new terminal type that does away with the accumulated cruft of 50 years. problem is you would also need new cli programs to go with it.

        • Alaknár@sopuli.xyz
          link
          fedilink
          English
          arrow-up
          4
          ·
          6 months ago

          Your comment reads extremely weird, considering both Mac and Windows handle this with zero issues.

          It’s super simple: if you’re in Select mode (any text is selected), Ctrl+C copies. In any other case, Ctrl-C is the cancel command.

  • Oinks@lemmy.blahaj.zone
    link
    fedilink
    arrow-up
    4
    ·
    edit-2
    6 months ago

    There’s apparently a ZSH plugin for this with a quite a few stars, though I haven’t used it and can’t speak for how well it works. In other shells what you want just doesn’t exist to my knowledge, though it should be possible to script it with enough effort.

    The problem is that in the terminal you always have at least two layers of input handling in the terminal emulator and the shell. And these layers talk to each other by emulating a 70s VT100. This leads to some issues, in no particular order:

    • Terminal emulator keybindings will step on shell keybindings, and the shell will never know about it because it can’t actually see the keys being pressed.
    • Even if the terminal doesn’t care about a key, it might be impossible or error-prone to detect anyway. This applies to surprisingly regular keys like Tab.
    • As you’ve noticed some terminals try to get clever and do things like making Ctrl-C copy if you’ve selected text. The shell doesn’t know about this either.
    • Most shells and TUI apps have selection modes. These are independent from terminal selections.
    • There’s no standard way of using the clipboard in Linux, but multiple different ones that may or may not work.

    All of these problems gets worse if you add multiplexers like tmux by the way.

    Now it would be possible to write a bespoke terminal emulator and shell combination that unifies selection and makes all the reasonable keybindings actually work. There are attempts at this, such as the Emacs Eshell. Unfortunately Emacs people don’t quite share your idea of what reasonable keybindings look like (and it’s also a little bit broken, though for mostly unrelated reason).

    Ultimately though the main reason this is an unsolved problem is that most Linux users just get used to the regular Readline line editor that all commonly used shells ship with. Complex edits can always be done in your $EDITOR (via C-X C-E in Bash).

  • pr06lefs@lemmy.ml
    link
    fedilink
    arrow-up
    3
    ·
    6 months ago

    I get those 3 bulleted features in my terminal, alacritty. But not with Shift. For highlighting I’m pretty much limited to selecting text with the mouse and ctrl-shift-c.

    For more sophisticated text selection, tmux comes to mind. Default key bindings appear to be emacs-esque, though vi style is possible too. Custom keybindings are possible as well. It does seem like you may be forced to enter a special mode for selection rather than having that available all the time with just shift.

    • podbrushkin@mander.xyzOP
      link
      fedilink
      arrow-up
      4
      ·
      edit-2
      6 months ago

      For more sophisticated text selection

      Here it is. What I’m asking for is not sophisticated at all, quite the opposite. I ask for keybindings which work in almost all text editing areas, in all applications, all operating systems. Vi and eMacs are steps in opposite direction. I think I even used a vi-mode in terminal a couple of years ago. I doubt it’s possible to simplify command editing with it.

  • Blaiz0r@lemmy.ml
    link
    fedilink
    arrow-up
    2
    ·
    6 months ago

    I feel your pain, the only one’s I know are…

    • CTRL+a = cursor to beginning of line
    • SHIFT+CTRL+c = Copy
    • SHIFT+CTRL+x = Cut
    • SHIFT+CTRL+v = Paste
    • Alaknár@sopuli.xyz
      link
      fedilink
      English
      arrow-up
      4
      ·
      6 months ago

      You can add:

      • CTRL+K = delete everything from the cursor to the right.
      • CTRL+U = delete everything from the cursor to the left.
      • rgalex@lemmy.world
        link
        fedilink
        arrow-up
        2
        ·
        6 months ago

        And just to complement those, CTRL+Y to “yank” back whatever was deleted with CTR+K or CTRL+U.

  • Remus86@lemmy.zip
    link
    fedilink
    arrow-up
    2
    ·
    6 months ago

    I know in zsh, fish, and nushell, you can press a key combo to jump into a text editor of your choice. You write your command there, with all the power and shortcuts in emacs, vim, nano (whatever you like to use). Then you save and exit, and it appears in your command line, ready to execute.

  • iopq@lemmy.world
    link
    fedilink
    arrow-up
    1
    ·
    6 months ago

    I would just like my inputs to be separate from the outputs. Anyone write a split pane thing?

    • podbrushkin@mander.xyzOP
      link
      fedilink
      arrow-up
      2
      ·
      6 months ago

      I’ve seen this and several others SO topics before posting. Some even recommend emulating a mouse with numpad. It’s like everyone suddenly start pretending not to know how text selection usually works.