neovim-qt icon indicating copy to clipboard operation
neovim-qt copied to clipboard

Support custom keybindings/shortcuts

Open hinell opened this issue 1 year ago • 5 comments

Xterm allows you to specify custom keybindings for certain sequences (e.g. <C-S-BS>) via ~/.Xresources files.

For neovim-qt, it's currently impossible to do the same so it makes sense to make feature configurable via ~/.config/nvim/ginit.vim. The proposed API may look like: GuiKeybinding <keysequence> <string-to-emit>.

The actual use of config may look like:

if exists(':GuiTabline')
    GuiKeybinding Ctrl+Shift+BackSpace "\E[27;6;8~"
endif

hinell avatar Dec 16 '22 00:12 hinell

I'm not sure I follow... Is there some reason the usual vim key binding mechanisms do not work for you?

For example, here are some key bindings I use in my vimrc:

" Shift Insert Paste (Command Mode, Insert Mode)
cmap <S-Insert> <C-R>+
imap <S-Insert> <C-R>+
nmap <silent> <Leader>t :GuiTreeviewToggle<CR>

Is there some reason the following mapping does not work for you? imap <C-BS> \E[27;6;8~

I'm not sure the intent of the \E[27;6;8~ sequence, but the binding above would insert those characters in Insert Mode.

Note: There is a bug with Shift + Backspace specifically: #259 #999

We're somewhat blocked by Neovim here... Eventually, we may be forced to apply a hacky forced mapping workaround.

jgehrig avatar Dec 16 '22 16:12 jgehrig

I'm not sure the intent of the \E[27;6;8~ sequence, but the binding above would insert those characters in Insert Mode.

Related:

  • https://github.com/neovim/neovim/issues/2204
  • https://github.com/neovim/neovim/issues/17108

Definitely would prefer to support this in Nvim so that GUIs don't need to reinvent this. Though I'm not sure if the exact request here is even blocked.

justinmk avatar Dec 16 '22 17:12 justinmk

@justinmk Currently nvim can catch custom sequences. The problem is that not every front-end sends them. Xterm or Konsole (uses PTY) doesn't send them by deafult. it can be enabled if bound by a proper key sequences in native terminal settings (.e.g in Konsole there are profiles). e.g. for Xterm:

! ~/.Xresources
! Last-Modified: Friday, December 16, 2022
! Use `man xterm` to learn more about these configs
XTerm.VT100.faceSize: 11 
XTerm.VT100.faceName: JetBrains Mono Nerd Font
XTerm.VT100.background: #232627
XTerm.VT100.foreground: #fcfcfc

! ANSI-like escape codes!
XTerm.VT100.translations: #override \n\
        Ctrl Shift <Key>BackSpace: string("\E[27;6;10~") \n\
             Shift <Key>BackSpace: string("\E[27;6;8~")

In nvim I catch them like this:

-- ~/.config/nvim/lua/keybindings.lua
... 
nvim.keymap.set({ 'i' }, 'E[27;6;10~', ... )

hinell avatar Dec 16 '22 18:12 hinell

Is there some reason the following mapping does not work for you?

@jgehrig It works, but I want separate bindings for ceratin commands, e.g.:

... <C-BS>   " deletes space-separated words
... <C-S-BS> " deletes (space-and-othersymbols)-separated words

The second one fails in many terminals and frontends. In Xterm it can be configured though (see above).

hinell avatar Dec 16 '22 18:12 hinell

I invented a brand new ANSI escape code. I'm using \E[Y and \E[2Y. Notably \E[Z is shift-tab (and neovim understands this inherently) which is why I didn't use Z. To my knowledge I do not know of any existing usage of the YXWVU values for this type of xterm sequences...

So anyway yeah I think we're still blocked on being able to introduce wholly new escape sequences to neovim???

There is the note by @hinell from above,

In nvim I catch them like this: -- ~/.config/nvim/lua/keybindings.lua ... nvim.keymap.set({ 'i' }, 'E[27;6;10~', ... )

However this makes no sense because there is no escaped escape character here and I tried a bunch of combos and got nothing to work.

Edit: sorry I don't use nvim-qt, will post in nvim github.

unphased avatar Jan 12 '24 12:01 unphased