Всегда используйте: установить пасту, это хорошая идея?


19

В терминальном vim вставка данных из буфера обмена часто портит отступ кода. Я просто знал, что если я использую :set pasteотступ не сломан. Хотя, после вставки данных, я должен сделать :set nopasteснова? Что если я не пойму, какая проблема возникнет?


Как насчет того, чтобы попробовать для себя? Или читаете документацию ?
romainl

1
См. Также «Режим вставки в скобках» в моем ответе «Вставка кода в окно терминала в vim» stackoverflow.com/a/7053522/754997 . Если ваш эмулятор терминала поддерживает его, вы можете настроить его так, чтобы Vim автоматически переключался в / из режима вставки всякий раз, когда вы вставляете текст в терминал.
Крис Пейдж

1
@romainl Я считаю вполне правдоподобным, что оба 1) пытаются и ждут, чтобы увидеть, есть ли негативные последствия всегда использовать set paste (+ - nopaste), и 2) rtfm-ing (как пользователь более низкого или среднего уровня, такой как OP) Менее полезны, чем спрашивать тех, кто имеет опыт работы с опциями. Запрашиваемая здесь кажется более разумным подходом, и документирование этого поможет другим.
Белаква

Ответы:


5

Как написали другие, вы не хотите оставлять «вставку» установленной. Я просто хотел отметить, что с хорошим эмулятором терминала и правильно скомпилированным и сконфигурированным vimвам не нужно менять «вставку». Вам нужен хороший эмулятор терминала, такой как xterm или GNOME Terminal, vim с включенной функцией X11 и опцией 'mouse', установленной в 'a'. Затем vim«узнает», когда вы вставляете мышью, и эффективно установит и отменит опцию «вставить» для вас.

Один из способов получить vimс помощью функции X11 - запустить gvimс -vопцией или создать псевдоним,

alias vim='gvim -v'

Затем положить

set mouse=a

в вашем ~ / .vimrc.


Когда я устанавливаю mouse = a, я не могу скопировать текст. «Копировать» отображается серым цветом в контекстном меню и в меню приложения.
Ли Даниэль Крокер

@LeeDanielCrocker: Copyбудет недоступен или вообще не будет отображаться, если не выбран какой-либо текст. Как вы выбираете текст для копирования?
garyjohn

Просто с помощью мыши. К вашему сведению, "у" работает нормально ... дергает текст и копирует его на системную клавиатуру. Это просто меню, которые не работают. Если для мыши установлено значение «r», то меню работает, но мышь содержит номера строк. В общем, я могу жить с мышью = а, я просто должен помнить, чтобы дергать вместо копирования.
Ли Даниэль Крокер

7

В этом сообщении есть мой любимый ответ: https://coderwall.com/p/if9mda/automatics-set-paste-mode-in-vim-when-pasting-in-insert-mode

В основном, если вы запускаете в режиме вставки и используете Ctrl + Shift + V или вставку правой кнопкой мыши с помощью мыши, Vim обнаруживает, что это пришло из терминала, и автоматически устанавливает режим вставки, а затем отменяет его, когда вы закончите, чтобы вы не потеряли переназначенные ключи. (который не может работать в режиме вставки, потому что он записывает необработанные данные), и вы вернетесь в «нормальное» состояние, когда это будет сделано.

Просто для vim (вставьте свой .vimrc)

let &t_SI .= "\<Esc>[?2004h"
let &t_EI .= "\<Esc>[?2004l"
inoremap <special> <expr> <Esc>[200~ XTermPasteBegin()

function! XTermPasteBegin()
  set pastetoggle=<Esc>[201~
  set paste
  return ""
endfunction

Если вы используете Vim под Tmux (все еще идет в .vimrc)

function! WrapForTmux(s)
  if !exists('$TMUX')
    return a:s
  endif

  let tmux_start = "\<Esc>Ptmux;"
  let tmux_end = "\<Esc>\\"

  return tmux_start . substitute(a:s, "\<Esc>", "\<Esc>\<Esc>", 'g') . tmux_end
endfunction

let &t_SI .= WrapForTmux("\<Esc>[?2004h")
let &t_EI .= WrapForTmux("\<Esc>[?2004l")

function! XTermPasteBegin()
  set pastetoggle=<Esc>[201~
  set paste
  return ""
endfunction

inoremap <special> <expr> <Esc>[200~ XTermPasteBegin()

Я полагаю, одна из let &t_SI .= "\<Esc>[?xxxxx"строк обнаруживает комбинацию клавиш для вставки? Работает ли это для Mac, а также учитывая другой ярлык?
Doub1ejack

@oub1ejack На самом деле они определяют escape-последовательности Xterm, а не то, как они назывались (т.е. 2004h - начало вставки), если ваш терминал поддерживает коды клавиш Xterm и передает их в Vim, он должен нормально работать на Mac.
dragon788

О, мой бог. ты мой герой. Я набрал так: установите nopaste так много раз.
Максвелл

3

Как предположил romainl, в документации объясняется, что установка этого 'paste'параметра отключает несколько других параметров, и вы наверняка обнаружите, что раньше, чем позже, это вызовет проблемы для вас. По этой причине есть 'pastetoggle'вариант. Видеть:

:help 'paste'
:help 'pastetoggle'

1

Если что-то существует, оно должно иметь свое значение. Вы должны внимательно изучить документацию vim, которая очень полезна.

  :help 'paste'
  :help 'pastetoggle'

Как только вы прочитаете, вы можете захотеть это:

" Toggle paste mode
"   (prefer this over 'pastetoggle' to echo current state)
nmap <leader>p :setlocal paste! paste?<cr>

Я надеюсь, что вы найдете этот пост полезным :)


1

Когда вы вставляете в vim, IIRC думает, что вы набрали все эти символы самостоятельно. Так что, если авто-отступ включен, он будет делать отступы для вас, но вставленный текст обычно содержит отступ, так что отступ действительно "испорчен". Переключение в режим вставки отключает такие вещи, как авто-отступ.

Если вам нравится автоматический отступ при вводе, вы должны переключить его обратно на nopaste после того, как закончите вставку. Попробуйте и обратите внимание, как вы должны делать все отступы вручную в режиме вставки.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.