G personalizzato: gli appunti fanno sì che la "p" venga incollata sempre nella stessa riga

Aug 20 2020

sfondo

Uso wayland e neovim e quando incollo del testo esterno si aggiunge ^Malla fine di ogni riga. Questo è un bug conosciuto" (https://github.com/neovim/neovim/issues/10223) ed esiste una soluzione alternativa: usare sed per tagliare ^M:

let g:clipboard = {
            \   'name': 'WL-Clipboard with ^M Trim',
            \   'copy': {
            \      '+': 'wl-copy --foreground --type text/plain',
            \      '*': 'wl-copy --foreground --type text/plain --primary',
            \    },
            \   'paste': {
            \      '+': {-> systemlist('wl-paste --no-newline | sed -e "s/\r$//"')}, \ '*': {-> systemlist('wl-paste --no-newline --primary | sed -e "s/\r$//"')},
            \   },
            \   'cache_enabled': 1,
            \ }

L'impostazione predefinita di Neovim è wl-pastesul mio sistema, quando g:clipboardnon è impostato.

Problema

Con la soluzione alternativa, neovim non incolla le copie linewise in una nuova riga.

  • Comportamento previsto : Vai su una riga -> premi Y-> vai al centro di un'altra riga -> premi p-> La riga copiata viene incollata in una nuova riga. Questo è ciò che accade quando è impostato no g:clipboard .

  • Comportamento osservato : Vai a una riga -> premi Y-> vai al centro di un'altra riga -> premi p-> La riga copiata viene incollata nella riga corrente. Questo è ciò che accade quando g:clipboardè impostato.

Quando si osserva il contenuto degli appunti di Wayland, ( wl-paste --no-newline | cat -A) sono gli stessi. Entrambi terminano con un carattere LF.

Domanda:

Perchè è questo? Cosa fa neovim per distinguere tra una pasta in una nuova riga e perché neovim non si incolla in una nuova riga quando l'usanza è g:clipboardin atto?

Risposte

3 Matt Aug 20 2020 at 01:40

Per impostazione predefinita systemlist()non conserva una nuova riga finale (cioè elimina l'ultima "stringa vuota" dalla lista risultante). Questo fa pensare a Neovim che il contenuto degli appunti sia di tipo "char", non "line".

Quindi devi invece fare quanto segue (vedi :h systemlist(), nota che la versione di Neovim differisce da quella di Vim):

{-> systemlist('wl-paste...', '', 1)}

Un'altra opzione, se stai utilizzando una versione GUI di Neovim esclusivamente, potresti preferire semplicemente inviare la richiesta RPC alla tua applicazione di frontend GUI che potrebbe essere in grado di servirla in modo indipendente dalla piattaforma (tramite Qt, Gtk, ecc. Ecc. .).

Ad esempio, nvim-qt viene fornito con un plug-in standard "nvim_gui_shim" che fornisce GuiClipboard()funzioni. E così eseguendo semplicemente :call GuiClipboard()si configurerà automaticamente un "custom" g:clipboardche ha già quelli rpcrequest()e le rpcnotify()chiamate.

Tuttavia, oltre a non funzionare con la normale console nvim, ho scoperto un altro brutto problema: almeno in nvim-qt richiede che l'interfaccia utente sia stata inserita e completamente preparata. E quindi potrebbe essere scomodo configurarlo all'avvio di Neovim. Ovviamente, puoi invece fornire le tue g:clipboardchiamate RPC (nota: i parametri RPC possono differire tra i diversi frontend della GUI; anche alcune applicazioni potrebbero scegliere di non implementare affatto tali richieste).

Un'altra opzione è implementare personalmente l'accesso agli appunti. Ecco il mio provider di appunti Neovim che può farlo senza dipendenze esterne. Tuttavia, finora ho implementato solo la versione Xlib, quindi non esiste un modulo nativo per Wayland.