it-swarm.com.ru

О каких темных углах Вима твоя мама никогда не говорила?

Существует множество вопросов, где люди говорят о распространенных уловках, а именно: " советы и рекомендации Vim + ctags ".

Тем не менее, я не имею в виду часто используемые ярлыки, которые новичок в Vim нашел бы крутыми. Я имею в виду опытного пользователя Unix (будь то разработчик, администратор и т.д.), Который думает, что знает что-то, о чем 99% из нас никогда не слышали и не мечтали. Что-то, что не только облегчает их работу, но и является ХОЛОДНЫМ и хакерским . В конце концов, Vim находится в самой богатой на темные уголки ОС в мире, поэтому у него должны быть тонкости, о которых только немногие привилегированные знают и хотят поделиться с нами.

782
Sasha

Может быть, это не тот, о котором 99% пользователей Vim не знают, но это то, чем я пользуюсь каждый день, и это должен знать любой пользователь Linux + Vim.

Основная команда, но чрезвычайно полезная.

:w !Sudo tee %

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

Очевидно, вы должны быть в системе с установленным Sudo и иметь права Sudo.

766
skinp

Что-то, что я недавно обнаружил, и которое мне показалось очень крутым:

:earlier 15m

Возвращает документ к тому, что было 15 минут назад. Может принимать различные аргументы для количества времени, которое вы хотите откатить, и зависит от уровней отмены. Может быть отменено противоположной командой :later

601
Chad Birch

:! [command] выполняет внешнюю команду, пока вы находитесь в Vim.

Но добавьте точку после двоеточия :.! [command], и она выведет вывод команды в ваше текущее окно. Это : . !

Например:

:.! ls

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

:.! date
402
Jeffrey Knight

Не совсем непонятно, но есть несколько команд удаления, которые очень полезны, например ..

  • diw для удаления текущего Word
  • di(, чтобы удалить в пределах текущих паренов
  • di" чтобы удалить текст между кавычками

Другие можно найти на :help text-objects

307
dbr

de Удалить все до конца Слова, нажав. по желанию вашего сердца.

ci (xyz [Esc] - Это странно. Здесь 'i' не означает режим вставки. Вместо этого это означает внутри скобок. Таким образом, эта последовательность сокращает текст внутри скобок, вы ' Он стоит внутри и заменяет его на "xyz". Он также работает в квадратных и фигурных скобках - просто сделайте ci [или ci {соответственно. Естественно, вы можете сделать di (если вы просто хотите удалить весь текст, ничего не печатая. также можно использовать a вместо i, если вы хотите удалить также скобки, а не только текст внутри них.

ci " - вырезать текст в текущих кавычках

ciw - вырезает текущее Слово. Это работает так же, как и предыдущий, за исключением того, что ( заменяется на w.

C - обрезать оставшуюся часть строки и переключиться в режим вставки.

ZZ - сохранить и закрыть текущий файл (ПУТЬ быстрее, чем Ctrl-F4, чтобы закрыть текущую вкладку!)

ddp - переместить текущую строку на одну строку вниз

xp - переместить текущий символ на одну позицию вправо

U - заглавными буквами, поэтому viwU подчеркивает слово

~ - переключает регистр, поэтому viw~ перевернет регистр всего Word

Ctrl + u/Ctrl + d прокрутить страницу на пол экрана вверх или вниз. Это кажется более полезным, чем обычная полноэкранная подкачка страниц, так как это упрощает просмотр взаимосвязи двух экранов. Для тех, кто все еще хочет прокручивать весь экран одновременно, есть Ctrl + f для Вперед и Ctrl + b для Назад. Ctrl + Y и Ctrl + E прокручивают вниз или вверх по одной строке за раз.

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

% находит и переходит к соответствующей круглой скобке.

de - удалить от курсора до конца Word (вы также можете сделать dE для удаления до следующего пробела)

bde - удалить текущее слово слева направо

df [пробел] - удалить до следующего пробела включительно

dt. - удалить до следующей точки

dd - удалить всю эту строку

вы (или уЕ) - сносит текст отсюда до конца Слова

ce - прорезает конец Слова

пока - копирует текущее Word (заставляет задуматься, что делает "hi"!)

гг - копирует текущую строку

cc - обрезает текущую строку, вместо этого вы также можете использовать S. Также есть нижняя крышка s, которая обрезает текущий символ и переключается в режим вставки.

viwy или viwc. Дерните или измените текущее Слово. Нажмите w несколько раз, чтобы выбрать каждое последующее слово, используйте b для перемещения назад

vi { - выделить весь текст в квадратных скобках. va {- выделить весь текст, включая {} s

vi (p - выделите все внутри () и замените вставленный текст

b и e перемещают курсор по словам, аналогично тому, как это обычно делают Ctrl + стрелки. Хотя определение Word немного отличается, так как несколько последовательных разделителей рассматриваются как одно Слово. Если вы начинаете с середины слова, нажатие кнопки b всегда приведет вас к началу текущего слова, а каждая последующая буква b перейдет к началу следующего слова. Точно так же, и легко запомнить, e возвращает курсор в конец текущего и каждого последующего Word.

аналогично b/e, заглавная B и E перемещают курсор по словам, используя только пробелы в качестве разделителей.

заглавная D (сделайте глубокий вдох) Удаляет остальную часть строки справа от курсора, так же, как Shift + End/Del в обычных редакторах (обратите внимание на 2 нажатия клавиш - Shift + D - вместо из 3)

235
ultraman

Тот, который я редко нахожу в большинстве уроков Vim, но он НЕВЕРОЯТНО полезен (по крайней мере для меня), это

g; and g,

перемещаться (вперед, назад) через список изменений.

Позвольте мне показать, как я его использую. Иногда мне нужно скопировать и вставить часть кода или строки, скажем, шестнадцатеричный цветовой код в файле CSS, поэтому я ищу, прыгаю (не обращая внимания на совпадение), копирую его и затем возвращаюсь назад (g;) туда, где Я редактировал код, чтобы наконец вставить его. Не нужно создавать отметки. Simpler.

Просто мои 2цента.

199
Xavier Guardiola
:%!xxd

Сделайте vim в шестнадцатеричный редактор.

:%!xxd -r

Откат.

Предупреждение: если вы не редактируете с помощью двоичного файла (-b), вы можете повредить файл. - Джош Ли в комментариях.

184
Bill Lynch
gv

Повторно выбирает последний визуальный выбор.

121
AaronS

Иногда настройка в вашем .vimrc будет переопределена плагином или автокомандой. Для отладки этого полезного трюка является использование команды: verbose в сочетании с: set. Например, чтобы выяснить, где Cindent был установлен/не установлен:

:verbose set cindent?

Это выведет что-то вроде:

cindent
    Last set from /usr/share/vim/vim71/indent/c.vim

Это также работает с картами и бликами. (Спасибо joeytwiddle за указание на это.) Например:

:verbose nmap U
n  U             <C-R>
        Last set from ~/.vimrc

:verbose highlight Normal
Normal         xxx guifg=#dddddd guibg=#111111 font=Inconsolata Medium 14
        Last set from ~/src/vim-holodark/colors/holodark.vim
119
Laurence Gonsalves

Не уверен, что это вообще считается темным углом, но я только что узнал об этом ...

:g/match/y A

восстановит (скопирует) все строки, содержащие "match", в регистр "a/@a. (Использование заглавной буквы в виде A делает vim добавление yankings вместо замены предыдущего содержимого регистра.) В последнее время я часто использовал его при создании таблиц стилей Internet Explorer.

98
sjh

:%TOhtml

Создает HTML-рендеринг текущего файла.

97
N 1.1

Хотите посмотреть на свою историю команд?

q:

Затем просмотрите, отредактируйте и, наконец, выполните команду.

Когда-нибудь вносить подобные изменения в два файла и переключаться между ними? (Скажите, исходный и заголовочный файлы?)

:set hidden
:map <TAB> :e#<CR>

Затем переключайтесь между этими файлами.

89
MikeyB

Vim откроет URL, например

vim http://stackoverflow.com/

Приятно, когда вам нужно подтянуть исходную страницу для справки.

79
Cercerilla

Макросы могут вызывать другие макросы, а также могут вызывать себя.

например:

[email protected]@q

... удалит первое слово из каждой строки до конца файла.

Это довольно простой пример, но он демонстрирует очень мощную функцию vim

68
spence91

Предполагая, что у вас скомпилирована поддержка Perl и/или Ruby, :rubydo и :perldo будут запускать однострочные символы Ruby или Perl в каждой строке диапазона (по умолчанию - весь буфер) с $_ привязан к тексту текущей строки (минус новая строка). Манипулирование $_ изменит текст этой строки.

Вы можете использовать это, чтобы делать определенные вещи, которые легко сделать на языке сценариев, но не так очевидны при использовании встроенных функций Vim. Например, чтобы изменить порядок слов в строке:

:perldo $_ = join ' ', reverse split

Чтобы вставить случайную строку из 8 символов (A-Z) в конце каждой строки:

:rubydo $_ += ' ' + (1..8).collect{('A'..'Z').to_a[Rand 26]}.join

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

55
Brian Carper

^ O и ^ I

Перейти на старую/новую позицию. Когда вы перемещаетесь по файлу (путем поиска, перемещения команд и т.д.), Vim запоминает эти "прыжки", так что вы можете повторять эти переходы назад (^ O - O для старых) и вперед (^ I - рядом с I на клавиатуре ). Я нахожу это очень полезным при написании кода и выполнении большого количества поисков.

ГИ

Перейдите в положение, где режим вставки был остановлен последним. Я часто редактирую, а потом что-то ищу. Чтобы вернуться в место редактирования, нажмите gi.

гс

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

ГФ

похож на gf, но распознает формат "[имя файла]: [номер строки]". Нажатие gF откроет [имя файла] и установит курсор на [номер строки].

^ P и ^ N

Автозаполнение текста при редактировании (^ P - предыдущее совпадение и ^ N следующее совпадение)

^ Х ^ л

В то время как редактирование завершается в той же строке (полезно для программирования). Вы пишете код, а затем вспоминаете, что у вас есть тот же код где-то в файле. Просто нажмите ^ X ^ L и полная строка завершена

^ X ^ F

Полные имена файлов. Вы пишете "/ etc/pass" Хм. Вы забыли имя файла. Просто нажмите ^ X ^ F и имя файла будет завершено

^ Z или: sh

Переместитесь временно в Shell. Если вам нужно быстрое избиение:

  • нажмите ^ Z (чтобы положить vi в фоновом режиме), чтобы вернуться в исходную оболочку, и нажмите fg, чтобы вернуться в vim
  • нажмите: sh, чтобы перейти к sub Shell, и нажмите ^ D/exit, чтобы вернуться к vi назад.
54
dimba

Это хороший трюк, чтобы открыть текущий файл с другой кодировкой:

:e ++enc=cp1250 %:p

Полезно, когда вам нужно работать с устаревшими кодировками. Поддерживаемые кодировки перечислены в таблице под encoding-values (см. helpencoding-values). Аналогичная вещь работает и для ++ff, так что вы можете снова открыть файл в конце строки Windows/Unix, если вы ошиблись в первый раз (см. helpff).

47
zoul
" insert range ip's
"
"          ( O O )
" =======oOO=(_)==OOo======

:for i in range(1,255) | .put='10.0.0.'.i | endfor
47
SergioAraujo

Ввод == исправит отступ текущей строки на основе строки выше.

На самом деле, вы можете сделать один = знак, а затем любую команду движения. = {движение}

Например, вы можете использовать% движения, которое перемещается между соответствующими скобками. Поместите курсор на {в следующем коде:

if (thisA == that) {
//not indented
if (some == other) {
x = y;
}
}

И нажмите =%, чтобы мгновенно получить это:

if (thisA == that) {
    //not indented
    if (some == other) {
        x = y;
    }
}

С другой стороны, вы можете сделать = a { внутри блока кода, вместо того, чтобы позиционировать себя прямо на символе {.

46
Kimball Robinson
imap jj <esc>
41
Trumpi

Давайте посмотрим, как довольно маленький редактор IDE выполняет транспонирование столбцов.

:%s/\(.*\)^I\(.*\)/\2^I\1/

Объяснение

\( и \) - это как помнить что-то в regex-land. И \1, \2 и т.д. - это то, как извлечь запомненный материал.

>>> \(.*\)^I\(.*\)

Запомните все, за которым следует ^I (вкладка), за которым следует все.

>>> \2^I\1

Замените вышеприведенный материал на "2-й материал, который вы помнили", а затем "1-й материал, который вы помнили" - по сути, сделав транспонирование.

37
chaos

Не совсем темный секрет, но мне нравится помещать следующее сопоставление в мой файл .vimrc, чтобы я мог нажать "-" (минус) в любое время, чтобы открыть проводник, чтобы показать файлы рядом с тем, который я только что отредактировал. В проводнике файлов я могу нажать другое "-", чтобы переместиться вверх на один каталог, обеспечивая плавный просмотр сложных структур каталогов (подобных тем, которые используются в настоящее время инфраструктурами MVC):

map - :Explore<cr>

Это может быть также полезно для кого-то. Мне нравится прокручивать экран и одновременно перемещать курсор:

map <c-j> j<c-e>
map <c-k> k<c-y>

Навигация по вкладкам - мне нравятся вкладки, и мне нужно легко перемещаться между ними:

map <c-l> :tabnext<enter>
map <c-h> :tabprevious<enter>

Только в Mac OS X: Safari-подобная навигация по вкладкам:

map <S-D-Right> :tabnext<cr>
map <S-D-Left> :tabprevious<cr>
30
KKovacs

Мне нравится использовать Sudo bash, и мой системный администратор ненавидит это. Он заблокировал "Sudo", чтобы его можно было использовать только с несколькими командами (ls, chmod, chown, vi и т.д.), Но я все равно смог использовать vim для получения командной оболочки root:

bash$ Sudo vi +'silent !bash' +q
Password: ******
root#
27
too much php

Часто мне нравится изменять текущие каталоги во время редактирования - поэтому мне приходится меньше указывать пути.

cd %:h
26
rampion

Я часто использую много окон, когда работаю над проектом, и иногда мне нужно изменить их размер. Вот что я использую:

map + <C-W>+
map - <C-W>-

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

24
Taurus Olson

Не незаметная функция, но очень полезная и экономящая время.

Если вы хотите сохранить сеанс из ваших открытых буферов, вкладок, маркеров и других настроек, вы можете выполнить следующее:

mksession session.vim

Вы можете открыть сеанс, используя:

vim -S session.vim
22
mohi666

Карта F5, чтобы быстро ROT13 ваш буфер:

map <F5> ggg?G``

Вы можете использовать его в качестве ключа босса :).

21
jqno
:r! <command>

вставляет вывод внешней команды в буфер.

Сделайте математику и получите результат прямо в тексте:

:r! echo $((3 + 5 + 8))

Получить список файлов для компиляции при написании Makefile:

:r! ls *.c

Не ищите тот факт, который вы прочитали в википедии, вставьте его прямо в документ, который вы пишете:

:r! lynx -dump http://en.wikipedia.org/wiki/Whatever
21
Roberto Bonvallet

Я только что нашел это сегодня через NSFAQ :

Комментируйте блоки кода.

Войдите в блочный визуальный режим, нажав CTRL-V.

Отметьте блок, который вы хотите прокомментировать.

Нажмите I (заглавная I) и введите строку комментария в начале строки. (// для C++)

Нажмите ESC, и все выбранные строки будут // добавлены к началу строки.

19
Grant Limberg

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

:set paste

перед вставкой в ​​ваши данные. Это будет держать его от путаницы.

Обратите внимание, что вам нужно будет ввести :set nopaste, чтобы восстановить авто-отступ. Альтернативные способы вставки предварительно отформатированного текста - это регистры буфера обмена (* и +) и :r!cat (вы должны закончить вставленный фрагмент с помощью ^ D).

Иногда полезно включить высококонтрастную цветовую схему. Это может быть сделано с

:color blue

Я заметил, что он не работает на всех версиях vim, которые я использую, но работает на большинстве.

17
Ian H

Вот что-то неочевидное. Если у вас есть много пользовательских плагинов/расширений в вашем $ HOME и вам иногда нужно работать с su/Sudo/..., то это может быть полезно.

В вашем ~/.bashrc:

export VIMINIT=":so $HOME/.vimrc"

В вашем ~/.vimrc:

if $HOME=='/root'
        if $USER=='root'
                if isdirectory('/home/your_typical_username')
                        let rtuser = 'your_typical_username'
                elseif isdirectory('/home/your_other_username')
                        let rtuser = 'your_other_username'
                endif
        else
                let rtuser = $USER
        endif
        let &runtimepath = substitute(&runtimepath, $HOME, '/home/'.rtuser, 'g')
endif

Это позволит загружать ваши локальные плагины - каким бы способом вы не меняли пользователя.

Вы также можете удалить файлы * .swp из вашего текущего пути в ~/vimtmp (это относится к .vimrc):

if ! isdirectory(expand('~/vimtmp'))
   call mkdir(expand('~/vimtmp'))
endif
if isdirectory(expand('~/vimtmp'))
   set directory=~/vimtmp
else
   set directory=.,/var/tmp,/tmp
endif

Кроме того, некоторые сопоставления, которые я использую, чтобы упростить редактирование - заставляют ctrl + s работать как escape и ctrl + h/l переключают вкладки:

inoremap <C-s> <ESC>
vnoremap <C-s> <ESC>
noremap <C-l> gt
noremap <C-h> gT
11
viraptor

Ctrl-n в режиме вставки автоматически завершит ввод любого набираемого вами слова на основе всех слов, находящихся в открытых буферах. Если найдено более одного совпадения, появится список возможных слов, которые вы можете пролистать, используя ctrl-n и ctrl-p.

11
Niki Yoshiuchi
gg=G

Исправляет отступ для всего файла. Мне не хватало моего верного <C-a><C-i> в Eclipse, но я только что узнал, что vim прекрасно с ним справляется.

10
daltonb

Возможность запуска Vim в режимах клиент/сервер.

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

Вы можете открыть сеанс и создать сервер, выполнив следующую команду:

vim --servername SAMPLESERVER -S session.vim

Обратите внимание, что вы можете открывать обычные текстовые файлы, если вы хотите создать сервер, и это не обязательно должен быть сеанс.

Теперь предположим, что вы находитесь в другом терминале и вам нужно открыть другой файл. Если вы регулярно открываете его, выдавая:

vim new_file.txt

Ваш файл будет открыт в отдельном буфере Vim, что затрудняет взаимодействие с файлами в вашем сеансе. Чтобы открыть new_file.txt в новой вкладке на вашем сервере, используйте эту команду:

vim --servername SAMPLESERVER --remote-tab-silent new_file.txt

Если сервер не запущен, этот файл будет открыт как обычный файл.

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

Я поместил в файл bashrc следующее:

alias vims='vim --servername SAMPLESERVER'
alias vimc='vim --servername SAMPLESERVER --remote-tab-silent'

Вы можете найти больше информации об этом по адресу: http://vimdoc.sourceforge.net/htmldoc/remote.html

9
mohi666

Хотите IDE?

:make запустит make-файл в текущем каталоге, проанализирует выходные данные компилятора, затем вы можете использовать :cn и :cp, чтобы просмотреть ошибки компилятора при открытии каждого файла и поиске нужного номера строки.

:syntax on включает подсветку синтаксиса vim.

9
caskey

Вариация судо пишут:

в .vimrc

cmap w!! w !Sudo tee % >/dev/null

После перезагрузки vim вы можете сделать "Sudo save" как

:w!!
9
jm666

HOWTO: Автозаполнение Ctags при использовании Vim в Bash. Для тех, кто использует Vim и Ctags, я написал небольшую функцию автозаполнения для Bash. Добавьте следующее в файл ~/.bash_completion (создайте его, если он не существует):

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

_vim_ctags() {
    local cur prev

    COMPREPLY=()
    cur="${COMP_WORDS[COMP_CWORD]}"
    prev="${COMP_WORDS[COMP_CWORD-1]}"

    case "${prev}" in
        -t)
            # Avoid the complaint message when no tags file exists
            if [ ! -r ./tags ]
            then
                return
            fi

            # Escape slashes to avoid confusing awk
            cur=${cur////\\/}

            COMPREPLY=( $(compgen -W "`awk -vORS=" "  "/^${cur}/ { print \\$1 }" tags`" ) )
            ;;
        *)
            _filedir_xspec
            ;;
    esac
}

# Files matching this pattern are excluded
excludelist='*[email protected](o|O|so|SO|so.!(conf)|SO.!(CONF)|a|A|rpm|RPM|deb|DEB|gif|GIF|jp?(e)g|JP?(E)G|mp3|MP3|mp?(e)g|MP?(E)G|avi|AVI|asf|ASF|ogg|OGG|class|CLASS)'

complete -F _vim_ctags -f -X "${excludelist}" vi vim gvim rvim view rview rgvim rgview gview

После перезапуска сеанса Bash (или создания нового) вы можете набрать:

Код:

~$ vim -t MyC<tab key>

и он автоматически завершит тег так же, как и для файлов и каталогов:

Код:

MyClass MyClassFactory
~$ vim -t MyC

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

8
michael

Я часто хочу выделить конкретное имя Word/функции, но пока не хочу искать следующий экземпляр:

map m* *#
8
Scotty Allen

% также полезен, если вы хотите разнести файлы между двумя разными копиями проекта, не изнашивая мизинцы (из корня проекта1):

:vert diffs /project2/root/%
7
Ben

: setlocal autoread

Автоматически перезагружает текущий буфер. Это особенно полезно при просмотре файлов журналов, и оно почти выполняет функции "хвостовой" программы в unix из vim.

Проверка на ошибки компиляции из vim. установить переменную makeprg в зависимости от языка, скажем, для Perl

: setlocal makeprg = Perl\-c \%

Для PHP

set makeprg = php\-l \%
set errorformat =% m\in \% f\on\line \% l

Выдача ": make" запускает связанный makeprg и отображает ошибки/предупреждения компиляции в окне быстрого исправления и может легко перейти к соответствующим номерам строк.

7
Naga Kiran

Я использую Vim для всего. Когда я редактирую сообщение электронной почты, я использую:

gqap (или gwap)

широко и легко и правильно переформатировать по параграфам, даже с вводными символами кавычек. Для достижения этой функциональности я также добавляю:

-c 'set fo=tcrq' -c 'set tw=76'

к команде, чтобы вызвать редактор извне. Одним заслуживающим внимания дополнением было бы добавление 'a' к параметру fo (formatoptions). Это автоматически переформатирует абзац при вводе и перемещении по содержимому, но может мешать или вызывать проблемы с ошибочным или странным форматированием, содержащимся в сообщении.

7
Gary Chambers

Я был уверен, что кто-то уже опубликовал бы это, но здесь идет.

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

установить mvn
mvn clean install
... и так далее

Чтобы сделать сборку, наведите курсор на строку и введите !! sh. То есть отфильтруйте эту строку; запишите это в Shell и замените результатами.

Журнал сборки заменяет строку, готовую к прокрутке, поиску, что угодно.

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

6
Brad Cox

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

Вам понадобится

  • 1x гВим
  • 1x rsync на удаленных и локальных машинах
  • 1x SSH секретный ключ авторизации на удаленном компьютере, поэтому вам не нужно вводить пароль
  • 1x Pageant
  • 1x шпатлевка

Настройка удаленного компьютера

Настройте rsync, чтобы сделать ваш рабочий каталог доступным. Я использую туннель SSH и разрешаю соединения только из туннеля:

address = 127.0.0.1
hosts allow = 127.0.0.1
port = 40000
use chroot = false
[bledge_ce]
    path = /home/xplasil/divine/bledge_ce
    read only = false

Затем запустите rsyncd: rsync --daemon --config = rsyncd.conf

Настройка локальной машины

Установите rsync из Cygwin. Запустите Pageant и загрузите свой закрытый ключ для удаленного компьютера. Если вы используете туннелирование SSH, запустите PuTTY, чтобы создать туннель. Создайте пакетный файл Push.bat в вашем рабочем каталоге, который будет загружать измененные файлы на удаленный компьютер с помощью rsync:

rsync --blocking-io *.cc *.h SConstruct rsync://localhost:40001/bledge_ce

SConstruct - это файл сборки для scons. Измените список файлов в соответствии с вашими потребностями. Замените localhost на имя удаленного компьютера, если вы не используете настройку SSH.

Настройка Vim Теперь это просто. Мы будем использовать функцию быстрого исправления (: make и список ошибок), но компиляция будет выполняться на удаленной машине. Итак, нам нужно установить makeprg:

set makeprg=Push\ &&\ plink\ -batch\ [email protected]\ \"cd\ /home/xplasil/divine/bledge_ce\ &&\ scons\ -j\ 2\"

Это сначала запустит задачу Push.bat для загрузки файлов, а затем выполнит команды на удаленном компьютере, используя SSH ( Plink из пакета PuTTY). Команда сначала меняет каталог на рабочий каталог, а затем начинает сборку (я использую scons).

Результаты сборки будут отображаться в вашем локальном списке ошибок gVim.

6
Roman Plášil

Введите символ из его шестнадцатеричного значения (режим вставки):

<C-Q>x[type the hexadecimal byte]
6
Luper Rouch

Поместите это в ваш .vimrc, чтобы получить команду pretty-print xml:

function FormatXml()
    %s:\(\S\)\(<[^/]\)\|\(>\)\(</\):\1\3\r\2\4:g
    set filetype=xml
    normal gg=G
endfunction

command FormatXml :call FormatXml()
6
Trumpi
 ============================================= ============= 
 В обычном режиме 
 ======================== ================================== 
 gf .......... ...... открыть файл под курсором в том же окне -> см .: h путь 
 Ctrl-w f .......... открыть файл под курсором в новом окне 
 Ctrl-w q .......... закрыть текущее окно 
 Ctrl-w 6 .......... открыть альтернативный файл -> см .: h # 
 gi ................ init insert mode в последней позиции вставки 
 '0 ................ место курсор, где он был, когда файл последний раз редактировался 
6
SergioAraujo

set colorcolumn=+1 или set cc=+1 для vim 7.3

5
quabug

При работе над проектом, в котором процесс сборки идет медленно, я всегда строю в фоновом режиме и перенаправляю вывод в файл с именем errors.err (что-то вроде make debug 2>&1 | tee errors.err). Это позволяет мне продолжить редактирование или просмотр исходного кода в процессе сборки. Когда он будет готов (используя pynotify на GTK, чтобы сообщить мне, что он завершен), я могу посмотреть на результат в vim, используя quickfix . Начните с выдачи: cf [ile], который читает файл ошибок и переходит к первой ошибке. Мне лично нравится использовать cwindow, чтобы получить результат сборки в отдельном окне.

4
Anders Holmberg

:sp %:h - список каталогов/выбор файла с использованием каталога текущего файла

(принадлежит как комментарий под подсказкой cd от rampion, но у меня пока нет прав на комментирование)

4
searlea

Непосредственно перед копированием и вставкой в ​​stackoverflow:

:retab 1
:% s/^I/ /g
:% s/^/    /

Теперь скопируйте и вставьте код.

Как и просили в комментариях:

retab 1. Это устанавливает размер вкладки в один. Но он также проходит через код и добавляет дополнительные вкладки и пробелы, чтобы форматирование не перемещало какой-либо фактический текст (т. Е. Текст выглядит одинаково после ratab).

% s/^ I// g: обратите внимание, что ^ I - результат нажатия на вкладку. Это ищет все вкладки и заменяет их одним пробелом. Так как мы только что сделали retab, это не должно привести к изменению форматирования, но поскольку размещение вкладок на веб-сайте является хитом и промахом, хорошо их удалить.

% s/^//: заменить начало строки четырьмя пробелами. Поскольку вы не можете на самом деле заменить начало строки чем-либо, в начале строки вставляется четыре пробела (это необходимо для форматирования SO, чтобы выделять код).

4
Martin York

Несколько полезных:

:set nu # displays lines
:44     # go to line 44
'.      # go to last modification line

Мой любимый: Ctrl + n Завершение слова!

4
dfens
In Insert mode 
<C-A>   - Increments the number under cursor 
<C-X>   - Decrements the number under cursor

Будет очень полезно, если мы хотим генерировать последовательные числа в vim
Скажем, если мы хотим вставить строки 1-10 с номерами от 1 до 10 [например, "1" в 1-й строке, "2" во 2-й строке ..]
вставьте "0" в первую строку и скопируйте строку и последние 9 раз, чтобы все строки показывали "0".

Запустите следующую команду Ex

:g/^/exe "norm " . line(".") . "\<C-A>"
3
Naga Kiran

Чтобы сделать vim более похожим на редактор IDE:

  • set nu - для номеров строк в левом поле.
  • set cul - выделяет строку, содержащую курсор.
3
mpe

Я люблю: ls command.

3
PuzzleCracker

В режиме вставки ctrl+xctrl+p завершит (с меню возможных завершений, если вам так нравится) текущий длинный идентификатор, который вы вводите.

if (SomeCall(LONG_ID_ <-- type c-x c-p here
            [LONG_ID_I_CANT_POSSIBLY_REMEMBER]
             LONG_ID_BUT_I_NEW_IT_WASNT_THIS_ONE
             LONG_ID_GOSH_FORGOT_THIS
             LONG_ID_ETC
             ∶
3
bobbogo

Повторное использование

Движения для смешивания с другими командами, больше здесь .

tx
fx
Fx

Используйте ваши любимые инструменты в Vim.

:r !python anything you want or awk or Y something

Повторите в визуальном режиме, мощный в сочетании с советами выше.

;
3
hhh

Заменить все

  :%s/oldtext/newtext/igc

Дай заменить всем :)

2
AIB

Чтобы скопировать текст из Vim в буфер обмена для использования другим приложением, выберите текст, который вы хотите скопировать в визуальном режиме, а затем нажмите "+ y. Таким образом, вы можете легко вставить свой текст в другие приложения.

Это особенно полезно, если вы разбили окно по вертикали и хотите скопировать что-нибудь из правого окна. Использование set mouse = r не поможет вам в этой ситуации, так как все будет выделено в левом окне.

Обратите внимание, что ваш vim должен быть скомпилирован с поддержкой xterm.

2
mohi666

Я собирал их на протяжении многих лет.

" Pasting in normal mode should append to the right of cursor
nmap <C-V>      a<C-V><ESC>
" Saving
imap <C-S>      <C-o>:up<CR>
nmap <C-S>      :up<CR>
" Insert mode control delete
imap <C-Backspace> <C-W>
imap <C-Delete> <C-O>dw
nmap    <Leader>o       o<ESC>k
nmap    <Leader>O       O<ESC>j
" tired of my typo
nmap :W     :w
2
Yada

Используйте правую кнопку мыши для переключения режима вставки в gVim со следующими настройками в ~/.gvimrc:

"
"------------------------------------------------------------------
" toggle insert mode <--> 'normal mode with the <RightMouse>-key
"------------------------------------------------------------------
nnoremap  <RightMouse> <Insert>
inoremap  <RightMouse> <ESC>
"
2
Fritz G. Mehner

макросы карты

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

Пример:

enum ProcStats
{
        ps_pid,
        ps_comm,
        ps_state,
        ps_ppid,
        ps_pgrp,
:map X /ps_<CR>3xixy<Esc>X

Дает:

enum ProcStats
{
        xypid,
        xycomm,
        xystate,
        xyppid,
        xypgrp,

Просто глупый пример :).

Я полностью осознаю все минусы - так уж получилось, что я в некоторых случаях счел это весьма полезным. Также может быть интересно посмотреть это на работе;).

2
Marcus Borkenhagen

Создайте функцию для выполнения текущего буфера, используя его Shebang (при условии, что он установлен), и вызовите его с помощью crtl-x.

map <C-X> :call CallInterpreter()<CR>

au BufEnter *
\ if match (getline(1) , '^\#!') == 0 |
\   execute("let b:interpreter = getline(1)[2:]") |
\ endif

fun! CallInterpreter()
    if exists("b:interpreter")
        exec("! ".b:interpreter." %")
    endif
endfun
2
jonyamo

Попробуйте использовать perltidy для форматирования с помощью команды = normal-mode

:set equalprg=perltidy
2
c9s

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

Тривиальные привязки, но я просто не могу жить без. Это позволяет движение в стиле hjkl в режиме вставки (с помощью клавиши ctrl). В обычном режиме: ctrl-k/j прокручивает половину экрана вверх/вниз и ctrl-l/h переходит к следующему/предыдущему буферу. Отображения µ и especially специально предназначены для клавиатуры AZERTY и переходят к следующей/предыдущей ошибке make.

imap <c-j> <Down>
imap <c-k> <Up>
imap <c-h> <Left>
imap <c-l> <Right>
nmap <c-j> <c-d>
nmap <c-k> <c-u>
nmap <c-h> <c-left>
nmap <c-l> <c-right>

nmap ù :cp<RETURN>
nmap µ :cn<RETURN>

Небольшая функция, которую я написал, чтобы выделить функции, глобальные переменные, макросы, структуры и typedefs. (Может быть медленным на очень больших файлах). Каждый тип получает различную подсветку (см. ": Help group-name", чтобы получить представление о настройках вашей текущей колортемы). Использование: сохраните файл с помощью ww (по умолчанию "\ ww"). Вам нужны ctags для этого.

nmap <Leader>ww :call SaveCtagsHighlight()<CR>

"Based on: http://stackoverflow.com/questions/736701/class-function-names-highlighting-in-vim
function SaveCtagsHighlight()
    write

    let extension = expand("%:e")
    if extension!="c" && extension!="cpp" && extension!="h" && extension!="hpp"
        return
    endif

    silent !ctags --fields=+KS *
    redraw!

    let list = taglist('.*')
    for item in list
        let kind = item.kind

        if     kind == 'member'
            let kw = 'Identifier'
        elseif kind == 'function'
            let kw = 'Function'
        elseif kind == 'macro'
            let kw = 'Macro'
        elseif kind == 'struct'
            let kw = 'Structure'
        elseif kind == 'typedef'
            let kw = 'Typedef'
        else
            continue
        endif

        let name = item.name
        if name != 'operator=' && name != 'operator ='
            exec 'syntax keyword '.kw.' '.name
        endif
    endfor
    echo expand("%")." written, tags updated"
endfunction

У меня есть привычка писать много кода и функций, и я не люблю писать для них прототипы. Поэтому я сделал некоторую функцию для генерации списка прототипов в исходном файле в стиле C. Он поставляется в двух вариантах: один удаляет имя формального параметра и другой сохраняет его. Я просто обновляю весь список каждый раз, когда мне нужно обновить прототипы. Это позволяет избежать несинхронизации прототипов и определений функций. Также нужны ctags.

"Usage: in normal mode, where you want the prototypes to be pasted:
":call GenerateProptotypes()
function GeneratePrototypes()
    execute "silent !ctags --fields=+KS ".expand("%")
    redraw!
    let list = taglist('.*')
    let line = line(".")
    for item in list
        if item.kind == "function"  &&  item.name != "main"
            let name = item.name
            let retType = item.cmd
            let retType = substitute( retType, '^/\^\s*','','' )
            let retType = substitute( retType, '\s*'.name.'.*', '', '' ) 

            if has_key( item, 'signature' )
                let sig = item.signature
                let sig = substitute( sig, '\s*\w\+\s*,',        ',',   'g')
                let sig = substitute( sig, '\s*\w\+\(\s)\)', '\1', '' )
            else
                let sig = '()'
            endif
            let proto = retType . "\t" . name . sig . ';'
            call append( line, proto )
            let line = line + 1
        endif
    endfor
endfunction


function GeneratePrototypesFullSignature()
    "execute "silent !ctags --fields=+KS ".expand("%")
    let dir = expand("%:p:h");
    execute "silent !ctags --fields=+KSi --extra=+q".dir."/* "
    redraw!
    let list = taglist('.*')
    let line = line(".")
    for item in list
        if item.kind == "function"  &&  item.name != "main"
            let name = item.name
            let retType = item.cmd
            let retType = substitute( retType, '^/\^\s*','','' )
            let retType = substitute( retType, '\s*'.name.'.*', '', '' ) 

            if has_key( item, 'signature' )
                let sig = item.signature
            else
                let sig = '(void)'
            endif
            let proto = retType . "\t" . name . sig . ';'
            call append( line, proto )
            let line = line + 1
        endif
    endfor
endfunction
2
RoaldFre

Мой любимый рецепт для переключения между окнами:

function! SwitchPrevWin()
    let l:winnr_index = winnr()
    if l:winnr_index > 1
       let l:winnr_index -= 1
    else
       "set winnr_index to max window open
        let l:winnr_index = winnr('$')
    endif
    exe l:winnr_index . "wincmd w" 
endfunction

nmap <M-z> :call SwitchPrevWin()
imap <M-z> <ESC>:call SwitchPrevWin()

nmap <C-z> :wincmd w
imap <C-z> <ESC>:wincmd w
1
ken

Я хотел бы разместить некоторые из моих собственных файлов конфигурации в after-directory . Это особенно полезно для ftplugin .

Вы можете избежать записи длинного списка augroup в вашем файле .vimrc вместо отдельных файлов для каждого типа.

Но, очевидно, каталог .vim/ftplugin делает то же самое, что и каталог .vim/after/ftplugin, но я бы предпочел оставить каталог .vim плагинам vim.

1
quabug

за это нить

Для префикса набора строк я использую один из двух разных подходов:

Одним из подходов является выбор блока (упомянутый sth). В общем, вы можете выбрать прямоугольную область с помощью ctrl-V, за которой следует перемещение курсора. Как только вы выделите прямоугольник, нажатие клавиши shift-I вставит символы с левой стороны прямоугольника, или shift-A добавит их с правой стороны прямоугольника. Таким образом, вы можете использовать эту технику для создания прямоугольника, который включает в себя крайний левый столбец строк, которые вы хотите добавить к префиксу, нажмите shift-I, введите префикс, а затем нажмите escape.

Другой подход заключается в использовании замены (как упомянуто Брайаном Агнью). Подстановка Брайана повлияет на весь файл (% в команде означает "все строки"). Чтобы воздействовать только на несколько строк, проще всего нажать Shift-V (который включает режим визуальной линии), находясь в первой/последней строке, а затем перейти к последней/первой строке. Затем введите:

: s/^/ВАША ПРЕФИКС /

^ Является регулярным выражением (в данном случае начало строки). Набрав это в режиме визуальной линии, вы увидите, что '<,'> вставляется перед символом s автоматически. Это означает, что диапазон замены будет визуальным выбором.

Дополнительный совет: если ваш префикс содержит косую черту, вы можете либо экранировать их обратной косой чертой, либо использовать другой знак пунктуации в качестве разделителя в команде. Например, чтобы добавить строковые комментарии C++, я обычно пишу:

: s: ^: //:

Для добавления суффикса подход замещения, как правило, проще, если все ваши строки не имеют одинаковую длину. Просто используйте $ для шаблона вместо ^, и ваша строка будет добавлена ​​вместо предварительной.

Если вы хотите добавить префикс и суффикс одновременно, вы можете сделать что-то вроде этого:

: s /.*/ PREFIX & SUFFIX /

. * Соответствует всей строке. Символ & в замене возвращает сопоставленный текст (всю строку) назад, но теперь к нему будут добавлены ваш префикс и суффикс.

Кстати, при комментировании кода вы, вероятно, захотите раскомментировать его позже. Вы можете использовать visual-block (ctrl-V), чтобы выбрать косые черты, а затем нажать d, чтобы удалить их, или вы можете использовать подстановку (возможно, с визуальным выделением линий, сделанным с помощью shift-V), чтобы удалить ведущие косые черты, как это :

: s: // ::

1
vehomzzz

Отображения, чтобы заставить движения работать на текущей строке экрана в режиме обтекания. Я обнаружил это в комментарии к совету Vim некоторое время назад, и это оказалось довольно удобным.

function! ScreenMovement(movement)
  if &wrap
    return "g" . a:movement
  else
    return a:movement
  endif
endfunction
onoremap <silent> <expr> j ScreenMovement("j")
onoremap <silent> <expr> k ScreenMovement("k")
onoremap <silent> <expr> 0 ScreenMovement("0")
onoremap <silent> <expr> ^ ScreenMovement("^")
onoremap <silent> <expr> $ ScreenMovement("$")
nnoremap <silent> <expr> j ScreenMovement("j")
nnoremap <silent> <expr> k ScreenMovement("k")
nnoremap <silent> <expr> 0 ScreenMovement("0")
nnoremap <silent> <expr> ^ ScreenMovement("^")
nnoremap <silent> <expr> $ ScreenMovement("$")
1
Mark42

Некоторые из моих обязательных:

cscope + ctags + vim, который можно найти в Интернете.

Некоторые сокращения для быстрого запуска новых файлов кода, такие как:

ab cpph #include <iostream><CR>#include <string><CR>#include <cstdlib><CR>#include <cassert><CR>#include <vector><CR>#include <
stdexcept><CR>using namespace std;<CR>int main(int argc, char *argv[]) {
ab perlh #!/usr/bin/Perl<CR>use strict;<CR>use warnings;<CR>
ab chdr #include <stdio.h><CR>#include <sys/types.h><CR>#include <unistd.h><CR>#include <stdlib.h><CR>#include <sys/stat.h><CR>
#include <sys/wait.h><CR>#include <string.h><CR>int main(int argc, char *argv[]) {
ab xhtmlhdr <?xml version="1.0" encoding="UTF-8"?><CR><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.o
rg/TR/xhtml1/DTD/xhtml1-strict.dtd"><CR><html xmlns="http://www.w3.org/1999/xhtml"><CR>  <head><CR>  <title></title><CR><link h
ref="style.css" rel="STYLESHEET" type="text/css"><CR></head>

Например, cpph вставит базовый каркас файла main.cc.

Существует также мое отображение функциональных клавиш:

map <F1> <Esc>:w<CR>:Perl $e = `./error.pl`; my ($f,$l,@w) = split(":",$e); my $w=join(":",@w); $curwin->Cursor($l,0); VIM::Msg($w);<CR>
map <F2> :wincmd w<CR>
map <F3> :wincmd s<CR>
map <F4> :wincmd v<CR>
map <F5> :wincmd o<CR>
map <F6> :sball<CR>
map <F7> :wq<CR>
map <F8> :wincmd q<CR>
map <F9> :wincmd -<CR>
map <F10> :wincmd +<CR>
map <F11> :wincmd <<CR>
map <F12> :wincmd ><CR>

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

map _ ebi"^[ea"^[

Эта карта заставит _ цитировать строку

1
piotr

Мой использует макросы вместо поиска - объединение макроса с визуальным режимом иногда более эффективно.

1
lukaszkorecki