G personalizzato: gli appunti fanno sì che la "p" venga incollata sempre nella stessa riga
sfondo
Uso wayland e neovim e quando incollo del testo esterno si aggiunge ^M
alla 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-paste
sul mio sistema, quando g:clipboard
non è 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 -> premip
-> La riga copiata viene incollata in una nuova riga. Questo è ciò che accade quando è impostato nog:clipboard
.Comportamento osservato : Vai a una riga -> premi
Y
-> vai al centro di un'altra riga -> premip
-> La riga copiata viene incollata nella riga corrente. Questo è ciò che accade quandog: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:clipboard
in atto?
Risposte
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:clipboard
che 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:clipboard
chiamate 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.