Какой ваш самый быстрый ярлык с Vim?

Мне нравится метод добавления / удаления инструмента patcher / maintenance / feature. Даже если по какой-то причине вам нужно что-то обновить как тривиальное, я не вижу здесь «парадокса цыпленка или яйца», это скорее «одна рука омывает другое».

  1. Проверка приложений сервер для обновлений, если таковые имеются, проверьте, обновляется ли патчер, если необходимо, патчер приложений
  2. Патчер выполняется как отдельный процесс, загружает обновление и уведомляет приложение о запросах на его установку
  3. Вы согласны с тем, что приложение завершает работу с уведомлением патчера, патчер распаковывает данные, заменяет exe, делает дополнительные вещи, которые могут понадобиться новой версии, и запускает ее и завершает
1127
задан 12 revs, 9 users 36% 16 August 2017 в 10:58
поделиться

34 ответа

Ваша проблема с Vim заключается в том, что вы не видите vi .

Вы упоминаете вырезание с помощью yy и жалуйтесь, что вы почти никогда не хотите разрезать целые строки. Фактически программисты, редактирующие исходный код, очень часто хотят работать над целыми строками, диапазонами строк и блоками кода. Однако yy - лишь один из многих способов скопировать текст в буфер анонимного копирования (или «регистр», как он называется в vi ).

«Дзен» vi означает, что вы говорите на каком-то языке. Начальное y является глаголом. Выражение yy является синонимом y_ . y удваивается, чтобы упростить ввод, поскольку это очень распространенная операция.

Это также может быть выражено как dd P (удалить текущую строку и вставить копию на место; оставив копию в анонимном регистре как побочный эффект). «Глаголы» y и d принимают любое движение своим «подлежащим». Таким образом, yW - это «перетащить отсюда (курсор) до конца текущего / следующего (большого) слова», а y'a - «перетащить отсюда на строку, содержащую отметка с именем « a ». "

Если вы понимаете только основные движения курсора вверх, вниз, влево и вправо, то vi будет не более продуктивным, чем копия« блокнота » " для тебя. (Хорошо, у вас все еще будет подсветка синтаксиса и возможность обрабатывать файлы размером более 45 КБ или около того; но работайте со мной здесь).

vi имеет 26 «меток» и 26 «регистров». Метка устанавливается в любое место курсора с помощью команды m . Каждый знак обозначается одной строчной буквой. Таким образом, ma устанавливает метку « a » в текущее местоположение, а mz устанавливает метку « z ». Вы можете перейти к строке, содержащей метку, с помощью команды ' (одинарная кавычка). Таким образом, 'a перемещается в начало строки, содержащей знак' a '. Вы можете перейти к точному местоположению любой метки с помощью команды ` (обратная кавычка). Таким образом, `z переместится прямо в точное местоположение метки ' z ».

Потому что это «перемещения» Таким образом, весь процесс требует 5 нажатий клавиш (шесть, если мы начали в режиме «вставки» и требовалось Esc out в командном режиме). После того, как мы вырезали или скопировали, вставка копии осуществляется одним нажатием клавиши: p .

Я говорю, что это один из способов вырезать или скопировать текст. Однако это только один из многих. Часто мы можем более кратко описать диапазон текста, не перемещая курсор и не опуская отметки. Например, если я нахожусь в абзаце текста, я могу использовать { и } перемещения к началу или концу абзаца соответственно. Итак, чтобы переместить абзац текста, я вырезал его, используя { d} (3 нажатия клавиши). (Если я уже нахожусь в первой или последней строке абзаца, я могу просто использовать d} или d { соответственно.

Понятие «абзац» по умолчанию означает нечто, что обычно интуитивно разумно. Таким образом, это часто работает как для кода, так и для прозы.

Часто мы знаем какой-то шаблон (регулярное выражение), который отмечает один или другой конец интересующего нас текста. Поиск вперед или назад - это движения в vi . Таким образом, они также могут использоваться в качестве «субъектов» в наших «утверждениях». Таким образом, я могу использовать d / foo для перехода от текущей строки к следующей строке, содержащей строку «foo» и y? Bar для копирования из текущей строки в самую последнюю ( предыдущая) строка, содержащая «бар». Если мне не нужны целые строки, я все равно могу использовать поисковые движения (как собственные утверждения), оставьте мою оценку (и) и используйте команды `x , как описано ранее.

В дополнение к« глаголам »и« субъектам » vi также имеет« объекты »(в грамматический смысл термина). Пока я описал только использование анонимного реестра. Однако я могу использовать любой из 26 «именованных» регистров, добавив к ссылке «объект» « (модификатор двойной кавычки). Таким образом, если я использую », добавьте Я разрезаю текущую строку в регистр « a », и если я использую «by / foo , то перетаскиваю копию текста отсюда в следующая строка, содержащая "foo" в регистре ' b '. Ни один из них не специфичен для Vim , и в vi есть гораздо более продвинутые приемы, если вы готовы их изучить. Если бы вы овладели только этими промежуточными концепциями, вы, вероятно, обнаружили бы, что вам редко нужно писать какие-либо макросы, потому что язык обработки текста достаточно лаконичен и выразителен, чтобы делать большинство вещей достаточно легко, используя «родной» язык редактора.


Примеры более сложных приемов:

Существует ряд команд : , в первую очередь метод глобальной подстановки :% s / foo / bar / g . (Это не продвинуто, но другие команды : могут быть). Весь набор команд : исторически унаследован vi ' s предыдущие воплощения в виде утилит ed (строковый редактор) и более поздних ex (расширенный строковый редактор). Фактически vi назван так, потому что это визуальный интерфейс для ex .

: команды обычно работают над строками текста. ed и ex были написаны в эпоху, когда экраны терминалов были редкостью, а многие терминалы были устройствами «телетайпа» (TTY). Поэтому было обычным делом работать с печатными копиями текста, используя команды через чрезвычайно краткий интерфейс (обычная скорость соединения составляла 110 бод, или, примерно, 11 символов в секунду, что медленнее, чем у быстрой машинистки; задержки были обычным явлением на многопользовательские интерактивные сеансы; кроме того, часто была некоторая мотивация для экономии бумаги).

Итак, синтаксис большинства : команды включают адрес или диапазон адресов (номер строки), за которым следует команда. Естественно, можно использовать буквальные номера строк: : 127 215 s / foo / bar , чтобы заменить первое вхождение «foo» на «bar» в каждой строке между 127 и 215. Можно также использовать некоторые сокращения, такие как . или $ для текущей и последней строк соответственно. Можно также использовать относительные префиксы + и - для обозначения смещений после или до текущей строки, соответственно. Таким образом: :., $ J означает «от текущей строки до последней, объединить их все в одну строку». :% является синонимом : 1, $ (все строки).

: ... g и : ... Команды v требуют пояснений, поскольку они невероятно мощны. : ... g - это префикс для "глобального" применения последующей команды ко всем строкам, которые соответствуют шаблону (регулярному выражению), а : ... v применяет такую ​​команду к все строки, которые НЕ соответствуют заданному шаблону ("v" от "conVerse"). Как и в случае с другими командами ex , они могут иметь префикс с помощью ссылок на адреса / диапазоны. Таким образом, :., + 21g / foo / d означает «удалить любые строки, содержащие строку« foo », из текущей через следующую 21 строку», а :., $ V / bar / d означает «отсюда до конца файла удалить все строки, которые НЕ содержат строку« bar ».

It ' Интересно, что общая команда Unix grep на самом деле была вдохновлена ​​этой командой ex (и названа в честь способа ее документирования). Команда ex : g / re / p (grep) была способом, которым они документировали, как «глобально» «печатать» строки, содержащие «регулярное выражение» (re). Когда использовались ed и ex , команда : p была одной из первых, которые кто-либо узнал, и часто первой использовалась при редактировании любого файла. Это было то, как вы печатали текущее содержимое (обычно только одну страницу, используя :., + 25p или что-то подобное).

Обратите внимание, что :% g /.../ d или (его аналог reVerse / conVerse: :% v /.../ d - наиболее распространенные шаблоны использования. Однако есть пара других команд ex , которые стоит запомнить:

Мы можем использовать m для перемещения строк и j для соединения строк. Например, если у вас есть список, и вы хотите разделить все материалы, соответствующие (или, наоборот, НЕ соответствующие какому-то шаблону), не удаляя их, то вы можете использовать что-то вроде: :% g / foo / m $ . .. и все строки "foo" будут перемещены в конец файла. (Обратите внимание на другой совет об использовании конца файла в качестве рабочего места). Это сохранит относительный порядок всех строк «foo» при извлечении их из остальной части списка. (Это было бы эквивалентно выполнению чего-то вроде: 1G! GGmap! Ggrep foo 1G: 1, 'ag / foo' / d (скопируйте файл в его собственный хвост, отфильтруйте хвост через grep и удалите все содержимое из головы).

Для соединения строк обычно я могу найти шаблон для всех строк, которые необходимо соединить с их предшественником (все строки которые начинаются с «^», а не с «^ *» в некоторых списках, например). В этом случае я бы использовал: :% g / ^ / -1j (для каждой совпадающей строки поднимитесь на одну строку вверх и присоединитесь к ним). (Кстати: для списков маркеров попытка поиска строк маркеров и присоединения к следующему не работает по нескольким причинам ... он может присоединить одну строку маркера к другой, и он не будет присоединяться ни к одной строке маркера к все его продолжений; он будет работать только попарно с совпадениями).

Излишне упоминать, что вы можете использовать нашего старого друга s (заменить) с командами g и v (global / converse-global). Обычно в этом нет необходимости. Однако рассмотрим случай, когда вы хотите выполнить замену только в строках, соответствующих некоторому другому шаблону. Часто вы можете использовать сложный шаблон с захватами и использовать обратные ссылки, чтобы сохранить части строк, которые вы НЕ хотите изменять. Однако часто бывает проще отделить совпадение от замены: :% g / foo / s / bar / zzz / g - для каждой строки, содержащей «foo», заменить все «bar» на « zzz. " (Что-то вроде :% s /\(.* foo. * \) Bar \ (. * \) / \ 1zzz \ 2 / g будет работать только в тех случаях, когда «bar» были Предшествует " я использовал что-то подобное всего несколько раз за последние 15 лет). Тем не менее, я открыто признаю, что я часто делал вещи итеративно и интерактивно, что, вероятно, можно было бы сделать более эффективно, если бы я нашел время, чтобы придумать правильное заклинание.

Еще одно очень полезное vi или ex команда : r для чтения содержимого другого файла. Таким образом: : r foo вставляет содержимое файла с именем «foo» в текущую строку.

Более мощной является команда : r! . Считывает результаты выполнения команды. Это то же самое, что приостановить сеанс vi , запустить команду, перенаправить ее вывод во временный файл, возобновить сеанс vi и прочитать содержимое из temp. файл.

Еще более мощными являются команды ! (бах) и : ...! ( экс бэнг). Они также выполняют внешние команды и считывают результаты в текущий текст. Однако они также фильтруют выделение нашего текста с помощью команды! Таким образом, мы можем отсортировать все строки в нашем файле с помощью 1G! Gsort ( G - это команда vi "goto"; по умолчанию выполняется переход к последней строке файла, но может иметь префикс в виде номера строки, например 1, первая строка). Это эквивалентно варианту ex : 1, $! Sort . Писатели часто используют ! с утилитами Unix fmt или fold для переформатирования или «переноса слов» выделенных фрагментов текста. Очень распространенный макрос - {! } fmt (переформатируйте текущий абзац). Программисты иногда используют его для запуска своего кода или только его частей с помощью отступа или других инструментов переформатирования кода.

Использование : r! и ! ] означает, что любую внешнюю утилиту или фильтр можно рассматривать как расширение нашего редактора. Я иногда использовал их со сценариями, извлекающими данные из базы данных, или с командами wget или lynx , которые извлекали данные с веб-сайта, или командами ssh , которые извлекали данные из удаленных систем.

Еще одна полезная команда ex - : so (сокращение от : source ). Это считывает содержимое файла как серию команд. Когда вы запускаете vi , он обычно неявно выполняет : источник в файле ~ / .exinitrc Vim обычно делает это в ~ / .vimrc , естественно, достаточно). Использование этого состоит в том, что вы можете изменить свой профиль редактора на лету, просто установив новый набор макросов, сокращений и настроек редактора. Если вы хитрый, вы даже можете использовать это как трюк для сохранения последовательностей команд редактирования ex для применения к файлам по запросу.

Например, у меня есть семистрочный файл (36 символов), который выполняется файл через wc и вставляет комментарий в стиле C вверху файла, содержащего данные подсчета слов. Я могу применить этот «макрос» к файлу с помощью такой команды: vim + 'so mymacro.ex'.

Команда @ , вероятно, самая непонятная команда vi . Время от времени преподавая курсы продвинутого системного администрирования в течение почти десяти лет, я встретил очень мало людей, которые когда-либо использовали его. @ выполняет содержимое регистра, как если бы это была команда vi или ex .
Пример: я часто использую: : r! Locate ... найти какой-нибудь файл в моей системе и прочитать его имя в моем документе. Оттуда я удаляю все посторонние совпадения, оставляя только полный путь к интересующему меня файлу. Вместо того, чтобы кропотливо перебирать Tab каждый компонент пути (или, что еще хуже, если я застрял) на машине без поддержки завершения Tab в его копии vi ) Я просто использую:

  1. 0i: r (чтобы превратить текущую строку в действительную команду : r ),
  2. "cdd (чтобы удалить строку в регистре" c ") и
  3. @c выполнить эту команду.

Это всего лишь 10 нажатий клавиш (и выражение » cdd @c для меня по сути является макросом для пальцев, поэтому я могу напечатать его почти так же быстро, как любое обычное шестибуквенное слово).


Отрезвляющая мысль

Я лишь слегка коснулся возможностей vi , и ни одно из того, что я здесь описал, не является даже частью "улучшений", для которых vim назван! Все, что я здесь описал, должно работать с любой старой копией vi , созданной 20 или 30 лет назад.

Есть люди, которые использовали значительно больше vi . сила, чем я когда-либо буду.

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

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

2861
ответ дан 19 December 2019 в 20:15
поделиться

Некоторые советы по повышению производительности:

Интеллектуальные движения

  • * и # поиск слова под курсором вперед / назад.
  • w к следующему слову
  • W к следующему разделенному пробелом слову
  • b / e до начала / конца текущего слова. ( B / E только для разделенных пробелом)
  • gg / G переход к началу / концу файла.
  • % перейти к совпадающему {..} или (..) и т. Д.
  • { / } перейти к следующему абзацу.
  • '. вернуться к последней редактированной строке.
  • g; вернуться к последней редактированной позиции.

Команды быстрого редактирования

  • I вставляются в начало.
  • добавить в конец.
  • o / O открыть новую строку после / перед текущей.
  • v / V / Ctrl + V визуальный режим (для выделения текста!)
  • Shift + R заменить текст
  • C изменить оставшуюся часть строки.

Комбинирование команд

Большинство команд принимают количество и направление, например:

  • cW = изменить до конца слова
  • 3cW = изменить 3 слова
  • BcW = чтобы начать полное слово, изменить полное слово
  • ciW = изменить внутреннее слово.
  • ci " = изменить внутренний между" .. "
  • ci ( = изменить текст между (..)
  • ci < = изменить текст между <..> (необходимо установить пары соответствий + = <:> в vimrc)
  • 4dd = удалить 4 строки
  • 3x = удалить 3 символа.
  • 3s = заменить 3 символа.

Полезные команды программиста

  • r заменяют один символ (например, rd заменяет текущий символ на d ).
  • ~ меняет регистр.
  • J соединяет две строки
  • Ctrl + A / Ctrl + X увеличивает / уменьшает число.
  • . повторить последнюю команду (простой макрос)
  • == исправить отступ строки
  • > блок отступа (в визуальном режиме)
  • < незакрепленный блок (в визуальном режиме)

Запись макроса

  • Нажмите q [клавиша] , чтобы начать запись.
  • Затем нажмите q , чтобы остановить запись.
  • Макрос можно воспроизвести с помощью @ [key] .

Используя очень специфические команды и движения, VIM может воспроизвести эти точные действия для следующих строк. (например, A для добавления в конец, b / e для перемещения курсора в начало или конец слова соответственно)

Пример хорошо продуманных настроек

# reset to vim-defaults
if &compatible          # only if not set before:
  set nocompatible      # use vim-defaults instead of vi-defaults (easier, more user friendly)
endif

# display settings
set background=dark     # enable for dark terminals
set nowrap              # dont wrap lines
set scrolloff=2         # 2 lines above/below cursor when scrolling
set number              # show line numbers
set showmatch           # show matching bracket (briefly jump)
set showmode            # show mode in status bar (insert/replace/...)
set showcmd             # show typed command in status bar
set ruler               # show cursor position in status bar
set title               # show file in titlebar
set wildmenu            # completion with menu
set wildignore=*.o,*.obj,*.bak,*.exe,*.py[co],*.swp,*~,*.pyc,.svn
set laststatus=2        # use 2 lines for the status bar
set matchtime=2         # show matching bracket for 0.2 seconds
set matchpairs+=<:>     # specially for html

# editor settings
set esckeys             # map missed escape sequences (enables keypad keys)
set ignorecase          # case insensitive searching
set smartcase           # but become case sensitive if you type uppercase characters
set smartindent         # smart auto indenting
set smarttab            # smart tab handling for indenting
set magic               # change the way backslashes are used in search patterns
set bs=indent,eol,start # Allow backspacing over everything in insert mode

set tabstop=4           # number of spaces a tab counts for
set shiftwidth=4        # spaces for autoindents
#set expandtab           # turn a tabs into spaces

set fileformat=unix     # file mode is unix
#set fileformats=unix,dos    # only detect unix file format, displays that ^M with dos files

# system settings
set lazyredraw          # no redraws in macros
set confirm             # get a dialog when :q, :w, or :wq fails
set nobackup            # no backup~ files.
set viminfo='20,\"500   # remember copy registers after quitting in the .viminfo file -- 20 jump links, regs up to 500 lines'
set hidden              # remember undo after quitting
set history=50          # keep 50 lines of command history
set mouse=v             # use mouse in visual mode (not normal,insert,command,help mode


# color settings (if terminal/gui supports it)
if &t_Co > 2 || has("gui_running")
  syntax on          # enable colors
  set hlsearch       # highlight search (very useful!)
  set incsearch      # search incremently (search while typing)
endif

# paste mode toggle (needed when using autoindent/smartindent)
map <F10> :set paste<CR>
map <F11> :set nopaste<CR>
imap <F10> <C-O>:set paste<CR>
imap <F11> <nop>
set pastetoggle=<F11>

# Use of the filetype plugins, auto completion and indentation support
filetype plugin indent on

# file type specific settings
if has("autocmd")
  # For debugging
  #set verbose=9

  # if bash is sh.
  let bash_is_sh=1

  # change to directory of current file automatically
  autocmd BufEnter * lcd %:p:h

  # Put these in an autocmd group, so that we can delete them easily.
  augroup mysettings
    au FileType xslt,xml,css,html,xhtml,javascript,sh,config,c,cpp,docbook set smartindent shiftwidth=2 softtabstop=2 expandtab
    au FileType tex set wrap shiftwidth=2 softtabstop=2 expandtab

    # Confirm to PEP8
    au FileType python set tabstop=4 softtabstop=4 expandtab shiftwidth=4 cinwords=if,elif,else,for,while,try,except,finally,def,class
  augroup END

  augroup perl
    # reset (disable previous 'augroup perl' settings)
    au!  

    au BufReadPre,BufNewFile
    \ *.pl,*.pm
    \ set formatoptions=croq smartindent shiftwidth=2 softtabstop=2 cindent cinkeys='0{,0},!^F,o,O,e' " tags=./tags,tags,~/devel/tags,~/devel/C
    # formatoption:
    #   t - wrap text using textwidth
    #   c - wrap comments using textwidth (and auto insert comment leader)
    #   r - auto insert comment leader when pressing <return> in insert mode
    #   o - auto insert comment leader when pressing 'o' or 'O'.
    #   q - allow formatting of comments with "gq"
    #   a - auto formatting for paragraphs
    #   n - auto wrap numbered lists
    #   
  augroup END


  # Always jump to the last known cursor position. 
  # Don't do it when the position is invalid or when inside
  # an event handler (happens when dropping a file on gvim). 
  autocmd BufReadPost * 
    \ if line("'\"") > 0 && line("'\"") <= line("$") | 
    \   exe "normal g`\"" | 
    \ endif 

endif # has("autocmd")

Настройки могут быть сохранены в ~ / .vimrc или для всей системы в /etc/vimrc.local , а затем считаны из / etc / vimrc файл, используя:

source /etc/vimrc.local

(вам придется заменить символ комментария # на ", чтобы он работал в VIM, я хотел дать здесь правильную подсветку синтаксиса).

Команды, которые я здесь перечислил, довольно простые, и основные из них я использую до сих пор. Они уже делают меня более продуктивным, без необходимости знать все причудливые вещи.

207
ответ дан 19 December 2019 в 20:15
поделиться

Несколько буферов и, в частности, быстрое переключение между ними для сравнения двух файлов с помощью : bp и : bn (правильно переназначено на single Shift + p или Shift + n )

vimdiff режим (разбивается на два вертикальных буфера, с цветами чтобы показать различия)

Копирование области с помощью Ctrl + v

И, наконец, завершение идентификаторов табуляцией (поиск «mosh_tab_or_complete»). Это меняет жизнь.

13
ответ дан 19 December 2019 в 20:15
поделиться

gi

Перейти к месту последнего редактирования (очень полезно, если вы выполнили поиск и хотите вернуться к редактированию)

^ P и ^ N

Завершить предыдущее (^ P) или следующий (^ N) текст.

^ O и ^ I

Перейти к предыдущему ( ^ O - «O» для старого) местоположения или к следующему ( ^ I - «I» как раз рядом с «O» ). Когда вы выполняете поиск, редактируете файлы и т. Д., Вы можете перемещаться по этим «прыжкам» вперед и назад.

48
ответ дан 19 December 2019 в 20:15
поделиться

CTRL + A увеличивает номер, на котором вы стоите.

42
ответ дан 19 December 2019 в 20:15
поделиться

Используйте встроенный файловый менеджер! Команда : Explore позволяет очень быстро перемещаться по исходному коду. У меня есть это отображение в моем .vimrc :

map <silent> <F8>   :Explore<CR>
map <silent> <S-F8> :sp +Explore<CR>

Проводник также позволяет вам вносить изменения в файлы. Я опубликую некоторые из моих любимых клавиш, нажатие даст вам полный список:

  • - : Наиболее полезные: переход в верхний каталог ( cd .. )
  • mf : Отметить файл
  • D : Удалить отмеченные файлы или файл, на котором установлен курсор, если ничего не отмечено.
  • R : Переименовать файл в курсор включен.
  • d : Создать новый каталог в текущем каталоге
  • % : Создайте новый файл в текущем каталоге
28
ответ дан 19 December 2019 в 20:15
поделиться

На днях я только что обнаружил всестороннее завершение Vim, и, хотя я признаю, что немного не уверен в том, что именно делает, у меня были удивительно хорошие результаты, просто смешав одно или другое Ctrl + x Ctrl + u или Ctrl + n / Ctrl + p в режиме вставки. Это не совсем IntelliSense , но я все еще изучаю его.

Попробуйте! : help ins-completion

22
ответ дан 19 December 2019 в 20:15
поделиться

+ W, V для разделения экрана по вертикали
+ W, W для переключения между окнами

! Python% [args] для запуска сценария, который я редактирую в этом окне

ZF в визуальном режиме для складывания произвольных строк

18
ответ дан 19 December 2019 в 20:15
поделиться

Массовые манипуляции с текстом!

Либо с помощью макроса:

  • Начать с записи: qq
  • Что-нибудь сделать
  • Остановить запись: q
  • Повторите: @q (первый раз), @@ после этого.
  • Повторите 20 раз: 20 @ @

Или через регулярные выражения:

  • Заменить материал: :% s / [fo] + / bar / g

(Но учтите: если вы сделаете последнее, у вас будут 2 проблемы :))

23
ответ дан 19 December 2019 в 20:15
поделиться

Автоматический отступ:

gg (перейти к началу документа)
= (время отступа!)
shift-g (перейти в конец документа)

Вам понадобится 'отступ плагина типа файла' в вашем файле .vimrc и, возможно, соответствующие настройки 'shiftwidth' и 'expandtab'.

14
ответ дан 19 December 2019 в 20:15
поделиться

Вы могли бы изучить использование механизма просмотра.

504
ответ дан 19 December 2019 в 20:15
поделиться

Все в нормальном режиме:

f для перехода к следующему экземпляр определенного символа в текущей строке и ; для повторения.

F для перехода к предыдущему экземпляру определенного символа в текущей строке и ; для повторения.

При разумном использовании эти два могут заставить вас невероятно быстро перемещаться по строке.

* на слове для поиска следующего экземпляра.

# по слову для поиска предыдущего экземпляра.

38
ответ дан 19 December 2019 в 20:15
поделиться

Согласен с верхним постером - команда : r! очень полезна.

Чаще всего я использую ее для "вставки" вещей:

:r!cat
**Ctrl-V to paste from the OS clipboard**
^D

Таким образом, мне не придется возиться с : установить пасту .

12
ответ дан 19 December 2019 в 20:15
поделиться

. Повторите последнюю команду изменения текста

Я сэкономил много времени с помощью этой.

Визуальный режим упоминался ранее, но блочный визуальный режим сэкономил мне много времени при редактировании столбцов фиксированного размера в текстовом файле. (доступно с помощью Ctrl-V).

53
ответ дан 19 December 2019 в 20:15
поделиться

На прошлой неделе на работе наш проект унаследовал много кода Python от другого проекта. К сожалению, код не вписывался в нашу существующую архитектуру - все было сделано с глобальными переменными и функциями, которые не работали бы в многопоточной среде.

У нас было ~ 80 файлов, которые нужно было переработать, чтобы они были объектно-ориентированными - все функции были перенесены в классы, параметры изменены, добавлены операторы импорта и т. Д. У нас был список из примерно 20 типов исправлений, которые необходимо было сделать для каждый файл.Я предполагаю, что, делая это вручную, один человек может делать, может быть, 2-4 в день.

Итак, я сделал первый вручную, а затем написал сценарий vim для автоматизации изменений. По большей части это был список команд vim, например.

" delete an un-needed function "
g/someFunction(/ d

" add wibble parameter to function foo "
%s/foo(/foo( wibble,/

" convert all function calls bar(thing) into method calls thing.bar() "
g/bar(/ normal nmaf(ldi(`aPa.

Последний заслуживает небольшого пояснения:

g/bar(/  executes the following command on every line that contains "bar("
normal   execute the following text as if it was typed in in normal mode
n        goes to the next match of "bar(" (since the :g command leaves the cursor position at the start of the line)
ma       saves the cursor position in mark a
f(       moves forward to the next opening bracket
l        moves right one character, so the cursor is now inside the brackets
di(      delete all the text inside the brackets
`a       go back to the position saved as mark a (i.e. the first character of "bar")
P        paste the deleted text before the current cursor position
a.       go into insert mode and add a "." 

Для пары более сложных преобразований, таких как генерация всех операторов импорта, я встроил некоторый питон в скрипт vim.

После нескольких часов работы над этим у меня был сценарий, который сделает не менее 95% преобразования. Я просто открываю файл в vim, затем запускаю : source fixit.vim , и файл преобразуется в мгновение ока.

У нас все еще есть работа по изменению оставшихся 5%, которые не стоили автоматизировать, и по тестированию результатов, но, потратив день на написание этого сценария, я считаю, что мы сэкономили недели работы.

Конечно, это можно было бы автоматизировать с помощью языка сценариев, такого как Python или Ruby, но это заняло бы гораздо больше времени для написания и было бы менее гибким - последний пример был бы трудным, поскольку одно регулярное выражение не могло может обрабатывать вложенные скобки, например для преобразования bar (foo (xxx)) в foo (xxx) .bar () . Vim идеально подходил для этой задачи.

32
ответ дан 19 December 2019 в 20:15
поделиться

Это не ярлыки, но они связаны:

  1. Сделайте capslock дополнительным ESC (или Ctrl)
  2. лидером карты в "," ( запятая) с помощью этой команды: let mapleader = ","

Они повышают мою продуктивность.

20
ответ дан 19 December 2019 в 20:15
поделиться

Я был удивлен, обнаружив, что никто не упоминает движение t . Я часто использую его со списками параметров в форме dt, или yt,

16
ответ дан 19 December 2019 в 20:15
поделиться

Я недавно (попал) на этот сайт: http://vimcasts.org/

Он довольно новый и действительно очень хороший. Парень, который ведет этот сайт, перешел с textmate на vim и проводит очень хорошие и краткие касты по конкретным темам vim. Зацените!

46
ответ дан 19 December 2019 в 20:15
поделиться

Плагины Vim

Здесь есть много хороших ответов, и один удивительный о дзен vi. Одна вещь, о которой я не упоминал, - это то, что vim чрезвычайно расширяем с помощью плагинов. Существуют скрипты и плагины, которые заставляют его делать все безумные вещи, которые автор оригинала никогда не рассматривал. Вот несколько примеров невероятно удобных плагинов для vim:

rails.vim

Rails.vim - это плагин, написанный tpope. Это невероятный инструмент для людей, занимающихся разработкой рельсов. Он выполняет волшебные контекстно-зависимые вещи, которые позволяют легко переходить от метода в контроллере к соответствующему представлению, к модели и вниз к модульным тестам для этой модели. Как разработчик рельсов он сэкономил десятки, если не сотни часов.

gist.vim

Этот плагин позволяет вам выбрать область текста в визуальном режиме и ввести быструю команду, чтобы опубликовать ее на gist.github.com . Это обеспечивает легкий доступ к pastebin, что невероятно удобно, если вы сотрудничаете с кем-то через IRC или IM.

space.vim

Этот плагин предоставляет специальные функции для клавиши пробела. Он превращает пробел в нечто похожее на точку, но вместо того, чтобы повторять действия, он повторяет движения. Это может быть очень удобно для быстрого перемещения по файлу способом, который вы определяете на лету.

Surround.vim

Этот плагин дает вам возможность работать с текстом, который каким-то образом разделен. Он дает вам объекты, которые обозначают вещи внутри скобок, предметы внутри кавычек и т. Д. Это может пригодиться для управления текстом с разделителями.

supertab.vim

Этот сценарий добавляет в vim причудливую функциональность завершения табуляции.Автозаполнение уже есть в ядре vim, но оно переносит его на быструю вкладку, а не на несколько различных сочетаний клавиш. Очень удобно и невероятно весело использовать. Хотя это не intellisense VS, это отличный шаг, который предоставляет большую функциональность, которую вы хотели бы ожидать от инструмента автозавершения вкладок.

syntastic.vim

Этот инструмент добавляет в vim команды внешней проверки синтаксиса. Я не использовал его лично, но слышал о нем много хорошего, и эту концепцию сложно превзойти. Проверка синтаксиса без необходимости делать это вручную - это отличная экономия времени и может помочь вам отловить синтаксические ошибки по мере их появления, а не после того, как вы наконец остановитесь для тестирования.

fugitive.vim

Прямой доступ к git изнутри vim. Опять же, я не использовал этот плагин, но вижу утилиту. К сожалению, я живу в культуре, где svn считается «новым», поэтому я вряд ли увижу git в действии в течение некоторого времени.

nerdtree.vim

Браузер деревьев для vim. Я начал использовать это недавно, и это действительно удобно. Это позволяет вам размещать древовидное изображение в вертикальном разделении и легко открывать файлы. Это отлично подходит для проекта с большим количеством исходных файлов, между которыми вы часто переключаетесь.

FuzzyFinderTextmate.vim

Это не поддерживаемый плагин, но все же невероятно полезный. Он предоставляет возможность открывать файлы с использованием «нечеткого» описательного синтаксиса. Это означает, что в разреженном дереве файлов вам нужно ввести только достаточное количество символов, чтобы отделить интересующие вас файлы от остального мусора.

Заключение

Для vim доступно множество невероятных инструментов.Я уверен, что я здесь только поцарапал поверхность, и стоит поискать инструменты, применимые к вашей области. Сочетание мощного набора инструментов традиционного vi, улучшений vim и плагинов, расширяющих vim еще больше, это один из самых эффективных способов редактирования текста, когда-либо задуманных. Vim такой же мощный, как emacs, eclipse, visual studio и textmate.

Спасибо

Спасибо duwanis за его vim-конфигурации , из которых я многому научился и позаимствовал большинство плагинов, перечисленных здесь.

91
ответ дан 19 December 2019 в 20:15
поделиться

Потратьте 30 минут на изучение руководства по vim (запустите vimtutor вместо vim в терминале). Вы изучите основные движения и некоторые нажатия клавиш, это сделает вас, по крайней мере, столь же продуктивным с vim, как с текстовым редактором, который вы использовали раньше. После этого, хорошо, прочтите ответ Джима Денниса еще раз :)

17
ответ дан 19 December 2019 в 20:15
поделиться

Визуальный режим

Как говорили некоторые другие люди, визуальный режим - это ответ на вашу проблему копирования / вырезания и вставки. Vim дает вам «v», «V» и C-v. Строчная буква «v» в vim по сути аналогична клавише Shift в блокноте. Приятно то, что вам не нужно удерживать его. Вы можете использовать любую технику движения, чтобы эффективно перейти к начальной (или конечной) точке вашего выбора. Затем нажмите «v» и снова используйте эффективные техники движения, чтобы перейти к другому концу вашего выделения.Затем «d» или «y» позволяют вырезать или скопировать это выделение.

Преимущество визуального режима vim перед описанием вырезания / копирования / вставки в vi Джимом Деннисом состоит в том, что вам не нужно указывать точное местоположение. Иногда более эффективно использовать быстрое движение, чтобы приблизиться к тому месту, куда вы хотите пойти, а затем уточнить это с помощью других движений, чем придумывать более сложную команду одиночного движения, которая доставит вас именно туда, куда вы хотите.

Обратной стороной такого широкого использования визуального режима является то, что он может стать опорой, которую вы используете все время, что мешает вам изучать новые команды vi (m), которые могут позволить вам делать что-то более эффективно. Однако, если вы очень активно изучаете новые аспекты vi (m), это, вероятно, не сильно на вас повлияет.

Я также еще раз подчеркну, что режимы визуальных линий и визуальных блоков дают вам вариации на эту же тему, которые могут быть очень мощными ... особенно режим визуального блока.

Об эффективном использовании клавиатуры

Я также не согласен с вашим утверждением, что чередование рук - самый быстрый способ использования клавиатуры. В этом есть доля правды. Если говорить в общем, то повторное использование одного и того же происходит медленно. Наиболее показательным примером этого принципа является то, что последовательные нажатия клавиш одним и тем же пальцем выполняются очень медленно. Ваше утверждение, вероятно, проистекает из естественной тенденции использовать преобразование s / finger / hand / в этом шаблоне. В некоторой степени это правильно, но на самом высоком конце спектра эффективности это неверно.

Спросите любого пианиста.Спросите их, быстрее ли сыграть последовательность из нескольких нот, чередуя руки, или последовательно использовать пальцы одной руки. Самый быстрый способ набрать 4 нажатия клавиш - не чередовать руки, а набирать их 4 пальцами одной руки в возрастающем или убывающем порядке (назовите это «бегом»). Это должно быть самоочевидным, если вы обдумаете такую ​​возможность.

Более сложная проблема - оптимизация для этого. Довольно легко оптимизировать абсолютное расстояние на клавиатуре. Vim делает это. Гораздо сложнее оптимизировать на уровне «выполнения», но vi (m) с его модальным редактированием дает вам больше шансов сделать это, чем любой немодальный подход (кхм, emacs) когда-либо мог.

О Emacs

Чтобы фанатики emacs полностью не проигнорировали весь мой пост из-за этого последнего комментария в скобках, я чувствую, что должен описать корень различия между религиями emacs и vim. Я никогда не высказывался во время войны редакторов и, вероятно, больше не буду этого делать, но я никогда не слышал, чтобы кто-то так описывал различия, так что вот оно. Разница заключается в следующем:

Vim дает вам непревзойденную эффективность редактирования необработанного текста Emacs дает вам непревзойденную возможность настраивать и программировать редактор

Слепые фанатики vim будут утверждать, что vim имеет язык сценариев. Но это непонятный, специализированный язык, который был разработан для обслуживания редактора. В Emacs есть Lisp! Достаточно сказано. Если вы не понимаете значения этих последних двух предложений или у вас есть желание узнать достаточно о функциональном программировании и Lisp, чтобы развить это понимание, тогда вам следует использовать vim.

Зилоты emacs будут утверждать, что emacs имеет режим viper, и поэтому это надмножество vim. Но режим гадюки нестандартен. Насколько я понимаю, режим viper не используется большинством пользователей emacs.Так как это не по умолчанию, большинство пользователей emacs, вероятно, не осознают преимущества модальной парадигмы.

На мой взгляд, эти различия ортогональны. Я считаю, что преимущества vim и emacs, как я уже говорил, действительны. Это означает, что окончательного редактора еще не существует. Вероятно, правда, что emacs будет самой простой платформой для создания идеального редактора. Но модальное редактирование не укоренилось в мышлении emacs. Сообщество emacs могло бы пойти по этому пути в будущем, но это маловероятно.

Так что, если вам нужна эффективность редактирования в чистом виде, используйте vim. Если вам нужна идеальная среда для написания сценариев и программирования, ваш редактор использует emacs. Если вам нужны оба варианта с упором на программируемость, используйте emacs с режимом viper (или запрограммируйте свой собственный режим). Если вы хотите получить лучшее из обоих миров, вам пока не повезло.

18
ответ дан 19 December 2019 в 20:15
поделиться

Я являюсь членом Американской ассоциации криптограмм. Журнал, выходящий раз в два месяца, включает более 100 криптограмм разного типа. Примерно 15 из них - это «криптарифмы» - различные типы арифметических задач, в которых цифры заменяются буквами. Два или три из них - судоку, за исключением букв вместо цифр. Когда сетка будет завершена, девять отдельных букв составят слово или слова на некоторой линии, диагонали, спирали и т. Д. Где-нибудь в сетке.

Вместо того, чтобы работать карандашом или набирать проблемы вручную, я загружаю их из личного кабинета на их веб-сайте.

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

Задача отформатирована в виде девяти групп по девять букв, где - представляют собой пробелы, записанные в две строки. Первый шаг - отформатировать их в девять строк по девять символов в каждой.В этом нет ничего особенного, просто вставьте восемь переносов строки в соответствующие места.

Результат будет выглядеть так:

T-O-----C
-E-----S-
--AT--N-L
---NASO--
---E-T---
--SPCL---
E-T--OS--
-A-----P-
S-----C-T

Итак, первый шаг в преобразовании этого числа в числа - составить список различных букв. Сначала я делаю копию блока. Я помещаю курсор в верхнюю часть блока, затем набираю : y}} p . : переводит меня в командный режим, y дергает следующую команду движения. Поскольку } - это переход в конец следующего абзаца, y} дергает абзац. } затем перемещает курсор в конец абзаца, а p вставляет то, что мы выдернули сразу после курсора. Итак, y}} p создает копию следующего абзаца, и в конце оказывается курсор между двумя копиями.

Затем я должен превратить одну из этих копий в список отдельных букв. Эта команда немного сложнее:

:!}tr -cd A-Z | sed 's/\(.\)/\1\n/g' | sort -u | tr -d '\n'

: снова переводит меня в командный режим. ! указывает, что содержимое следующего восстановления должно быть передано через командную строку. } дергает следующий абзац, а затем командная строка использует команду tr для удаления всего, кроме прописных букв, команда sed для печати каждого букву в одной строке и команду sort для сортировки этих строк, удаляя дубликаты, а затем tr удаляет символы новой строки, оставляя девять отдельных букв в одной строке, заменяя девять строк, которые изначально составляли абзац. В данном случае это следующие буквы: ACELNOPST .

Следующим шагом является создание еще одной копии сетки. А затем использовать буквы, которые я только что определил, чтобы заменить каждую из этих букв цифрой от 1 до 9. Это просто: :!} Tr ACELNOPST 0-9 . Результат:

8-5-----1
-2-----7-
--08--4-3
---4075--
---2-8---
--7613---
2-8--57--
-0-----6-
7-----1-8

Затем эту проблему можно решить обычным способом или ввести в любую программу решения судоку, которую вы предпочитаете. Готовое решение затем можно преобразовать обратно в буквы с помощью :!} tr 1-9 ACELNOPST .

В vi есть сила, которой не уступают очень немногие другие. Самая большая проблема заключается в том, что лишь очень немногие учебники, веб-сайты, файлы справки и т. Д. По vi делают больше, чем просто касаются поверхности того, что возможно.

25
ответ дан 19 December 2019 в 20:15
поделиться

Механизм Control+R очень полезен :-) В режиме вставки или командном режиме (т.е. на строке : при наборе команд), продолжите нумерованный или именованный регистр:

  • a - z именованные регистры
  • " безымянный регистр, содержащий текст последнего удаления или выдергивания
  • % имя текущего файла
  • # имя альтернативного файла
  • * содержимое буфера обмена (X11: основное выделение)
  • + содержимое буфера обмена
  • / последний шаблон поиска
  • : последняя командная строка
  • . последний вставленный текст
  • - последнее небольшое (меньше строки) удаление
  • =5*5 вставка 25 в текст (мини-калькулятор)

См. :help i_CTRL-R и :help c_CTRL-R для более подробной информации, и порыскайте поблизости, чтобы найти больше CTRL-R.

98
ответ дан 19 December 2019 в 20:15
поделиться

Используйте \ c в любом месте поиска, чтобы игнорировать регистр (игнорируя настройки регистратора или смарт-кейса). Например. / \ cfoo или / foo \ c будет соответствовать foo , Foo , fOO , FOO и т. Д.

Используйте \ C в любом месте поиска для принудительного сопоставления регистра. Например. / \ Cfoo или / foo \ C будет соответствовать только foo.

16
ответ дан 19 December 2019 в 20:15
поделиться

Вы спросили о продуктивных сочетаниях клавиш, но я думаю, что ваш настоящий вопрос: стоит ли vim того? Ответ на этот вопрос на stackoverflow -> "Да"

Вы, должно быть, заметили две вещи. Vim мощный, и vim трудно изучить. Большая часть его мощи заключается в его расширяемости и бесконечном сочетании команд. Не чувствуйте себя подавленным. Идите медленно. По одной команде, по одному плагину за раз. Не переусердствуйте.

Все те инвестиции, которые вы вложили в vim, окупятся тысячекратно. Вы проведете в текстовом редакторе много-много часов, прежде чем умрете. Vim будет вашим спутником.

14
ответ дан 19 December 2019 в 20:15
поделиться

Session

a. сохранить session

:mks sessionname

b. принудительно сохранить session

:mks! sessionname

c. загрузить сессию

gvim или vim -S sessionname


Сложение и вычитание

a. Сложение и вычитание

CTRL-A ;Добавить [count] к числу или буквенному символу на или после курсора. {нет в Vi

CTRL-X ;Вычитание [count] из числа или буквенного символа вычесть [count] из числа или буквенного символа, находящегося у курсора или после него. {нет в Vi}

b. Разгруппировка клавиш окна

В окне, Ctrl-A уже отображена для выбора всего файла, вам нужно снять отображение в файле rc. отметьте часть отображения CTRL-A в файле mswin.vim как комментарий или добавьте свой rc-файл с помощью команды unmap

c. С макросом

Команда CTRL-A очень полезна в макросе. Пример: Для создания нумерованного списка выполните следующие действия.

  1. Создайте первый элемент списка, убедитесь, что он начинается с цифры.
  2. qa - начать запись в буфер 'a'
  3. Y - выдернуть запись
  4. p - поместить копию записи ниже первой
  5. CTRL-A - увеличить номер
  6. q - остановить запись
  7. @a - повторить выдергивание, помещение и увеличение несколько раз
34
ответ дан 19 December 2019 в 20:15
поделиться

Игнорирование вопроса на мгновение (мой ответ ниже), пара вещей, которые могут помочь с вашими проблемами с vim:

:map <C-F> /\V

Это заставит Ctrl-F начать поиск с первые символы поиска - \ V , что отключает всю «магию», поэтому вам не нужно ничего избегать (как в PsPad).

" CTRL-X and SHIFT-Del are Cut
vnoremap <C-X> "+x
vnoremap <S-Del> "+x

" CTRL-C and CTRL-Insert are Copy
vnoremap <C-C> "+y
vnoremap <C-Insert> "+y

" CTRL-V and SHIFT-Insert are Paste
map <C-V>       "+gP
map <S-Insert>      "+gP

cmap <C-V>      <C-R>+
cmap <S-Insert>     <C-R>+

(взято непосредственно из mswin.vim из дистрибутива Vim). Это даст вам Ctrl-C, Ctrl-V и т. Д. Для копирования и вставки.

Лично я считаю, что копирование и вставка намного лучше со стандартным Vim. В Vim я могу поместить курсор на строку, введите yy , чтобы скопировать его, 10p , чтобы вставить его 10 копий. С помощью плагина Align я могу затем использовать Ctrl-V (при условии, что сопоставления окон выше не являются t использовано) для визуального блока выбрать столбец чисел, который был создан; : II затем автоматически увеличивает этот столбец чисел. Точно так же с YankRing я могу скопировать 10 (или более) строк одну за другой, а затем вставить их обратно одну за другой.

Что касается того, как Vim делает меня более продуктивным, я бы сказал что файл тегов - единственное, без чего я больше не могу обойтись. Когда курсор находится над тегом, я могу нажать Ctrl -] , чтобы перейти к функции (и Ctrl-T, чтобы вернуться, столько уровней, сколько мне нравится) или , p , чтобы откройте определение функции или макроса (или что-то еще) в окне предварительного просмотра (которое затем можно быстро закрыть с помощью: pcl) или [i , чтобы просто показать определение макроса в строке состояния. Эти инструменты неоценимы для навигации по сложному исходному коду.

7
ответ дан 19 December 2019 в 20:15
поделиться

Вы можете изучить использование механизма просмотра.

ctrl + v, (selecting text on multiple lines), I, (type something I want), ESC

Запись макроса для редактирования текста и запуск его N раз:

q, a (or some other letter), (do the things I want to record), q, ESC,
(type N, as in the number of times I want to run the macro), @, a
7
ответ дан 19 December 2019 в 20:15
поделиться

Третий критерий для ускорения редактирования - это количество необходимых нажатий клавиш. Я бы сказал, что это более важно, чем ваши другие 2. В vim почти все операции требуют меньшего количества нажатий клавиш, чем любой другой редактор, с которым я знаком.

Вы упомянули, что у вас проблемы с вырезанием и вставкой, но похоже, что вам нужно больше опыта с общими командами движения в vim. перетащить 3 слова: y3w перетянуть от курсора к следующей точке с запятой: yf; перейти к следующему вхождению вашего последнего запроса: yn Все это намного быстрее, чем пытаться перемещаться с помощью мыши, удерживая нажатой клавишу-модификатор. Кроме того, как видно из некоторых примеров в ответе CMS, команды движения vim оптимизированы для эффективной навигации в исходном коде C и C ++.

Что касается вопроса «как мне использовать vim, чтобы сделать меня более продуктивным?», Надеюсь, ответ: «эффективно».

10
ответ дан 19 December 2019 в 20:15
поделиться

Мой самый продуктивный трюк с vi / Vim:

:%s

Мне нравится иметь возможность использовать регулярные выражения на лету для замены всего, что я хочу внутри файла. Каждый текстовый редактор должен поддерживать регулярные выражения IMHO.

10
ответ дан 19 December 2019 в 20:15
поделиться