사용자 정의 g : clipboard 결과`p`는 항상 같은 줄에 붙여 넣습니다.
배경
나는 wayland와 neovim을 사용하며 외부 텍스트를 붙여 넣을 때 ^M
각 줄의 끝에 추가 됩니다. 이것은 알려진 "버그"(https://github.com/neovim/neovim/issues/10223) 해결 방법이 있습니다. sed를 사용하여 다음을 트리밍합니다 ^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,
\ }
Neovim 이 설정되지 않은 wl-paste
경우 내 시스템에서 기본적으로 g:clipboard
설정됩니다.
문제
해결 방법이 있으면 neovim은 줄 바꿈에 줄 단위 복사본을 붙여 넣지 않습니다.
예상되는 동작 : 줄 이동-> 누름
Y
-> 다른 줄 중간으로 이동-> 누름p
-> 복사 된 줄이 새 줄에 붙여 넣어 집니다. 이것은 nog:clipboard
가 설정 되었을 때 일어나는 일 입니다.관찰 된 동작 : 행 이동-> 누르기
Y
-> 다른 행 중간으로 이동-> 누르기p
-> 복사 된 행이 현재 행에 붙여 넣어 집니다 . 이g:clipboard
설정 되면 발생합니다 .
wayland 클립 보드의 내용을 관찰 할 때 ( wl-paste --no-newline | cat -A
)는 동일합니다. 둘 다 LF 문자로 끝납니다.
질문:
왜 이런거야? neovim은 새로운 라인에 붙여 넣기를 구별하기 위해 무엇을하며, neovim은 왜 새로운 라인에 붙여 넣지 않습니다 g:clipboard
.
답변
기본적 systemlist()
으로 최종 개행을 유지하지 않습니다 (즉, 결과 목록에서 마지막 "빈 문자열"항목을 삭제합니다). 따라서 Neovim은 클립 보드의 내용이 "line"이 아닌 "char"유형이라고 생각합니다.
따라서 대신 다음을 수행해야합니다 (참조 :h systemlist()
, Neovim 버전은 Vim의 버전과 다릅니다).
{-> systemlist('wl-paste...', '', 1)}
또 다른 옵션은 Neovim의 GUI 버전을 독점적으로 사용하는 경우 플랫폼 독립적 인 방식 (Qt, Gtk 등을 통해 제공 할 수있는 GUI 프론트 엔드 애플리케이션에 RPC 요청을 보내는 것)을 선호 할 수 있습니다. .).
예를 들어, nvim-qt는 GuiClipboard()
기능 을 제공하는 표준 "nvim_gui_shim"플러그인과 함께 제공 됩니다. 따라서 실행하면 이미 해당 및 호출 이있는 :call GuiClipboard()
"사용자 지정"이 자동으로 설정됩니다 .g:clipboard
rpcrequest()
rpcnotify()
그러나 일반 콘솔 nvim에서는 작동하지 않는 것 외에도 또 다른 불쾌한 문제를 발견했습니다. 적어도 nvim-qt에서는 UI가 입력되고 완전히 준비되어야합니다. 따라서 Neovim을 시작할 때 설정하는 것이 불편할 수 있습니다. 물론 g:clipboard
RPC 호출을 대신 제공 할 수 있습니다 (참고 : RPC 매개 변수는 GUI 프런트 엔드마다 다를 수 있으며 일부 응용 프로그램은 이러한 요청을 전혀 구현하지 않도록 선택할 수도 있습니다).
또 다른 옵션은 클립 보드 액세스를 직접 구현하는 것입니다. 다음 은 외부 종속성없이이 작업을 수행 할 수있는 자체 Neovim 클립 보드 공급자입니다. 그러나 지금까지는 Xlib 버전 만 구현 했으므로 Wayland에 대한 기본 모듈이 없습니다.