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

Начальная настройка

Я не собираюсь предполагать наличие большого опыта работы с vim. Я предполагаю, что вы работаете на Mac, как любой умный язычник. Сначала установите Homebrew.

Установите неовим. vim унаследовал. Да здравствует неовим.

brew update
brew tap homebrew/versions
brew install homebrew/versions/llvm36
brew tap neovim/homebrew-neovim
brew install —-HEAD neovim
pip install neovim

Установите vim-plug, простой менеджер подключаемых модулей для vim, не имеющий шаблонного кода и выполняющий асинхронные установки и обновления:

curl -fLo ~/.nvim/autoload/plug.vim --create-dirs \
    https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim

neovim хранит все свои настройки в .nvimrc, который написан в скрипте vim. Его можно найти по адресу ~ / .nvimrc. Добавьте к нему это, чтобы вы могли начать свой список плагинов для установки:

call plug#begin()
" We will put plugins here later
call plug#end()

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

Автозавершение кода + встроенные ошибки и предупреждения

Это во-первых, потому что это, возможно, самое важное. Objective-C не написан для краткости или легкого запоминания. Он предназначен для удобного чтения. Вы хотите YouCompleteMe.

Plug 'Valloric/YouCompleteMe' "code completion

Добавьте к вам ~ / .nvimrc, чтобы получить завершение семантического кода, аналогичное Xcode:

let g:ycm_semantic_triggers = {
 \ 'objc' : ['re!\@"\.*"\s',
 \ 're!\@\w+\.*\w*\s',
 \ 're!\@\(\w+\.*\w*\)\s',
 \ 're!\@\(\s*',
 \ 're!\@\[.*\]\s',
 \ 're!\@\[\s*',
 \ 're!\@\{.*\}\s',
 \ 're!\@\{\s*',
 \ "re!\@\’.*\’\s",
 \ '#ifdef ',
 \ 're!:\s*',
 \ 're!=\s*',
 \ 're!,\s*', ],
 \ }

Теперь вам нужно заполнить флаги компилятора clang, чтобы YouCompleteMe мог выполнять семантическое завершение кода, а также встроенные предупреждения и ошибки. Это не так сложно, как может показаться. По сути, просто скопируйте этот файл в корень вашего проекта. Затем создайте свой проект с помощью xcodebuild. Посмотрите на флаги, которые он использует для создания одного из ваших исходных файлов, и перенесите эти флаги в правильном формате в массив flags [] в этом файле .ycm_extra_conf.py. Вы можете увидеть пример команды xcodebuild ниже в этой статье.

Примечание: Эта ошибка в настоящее время является самым большим препятствием для полного завершения кода, подобного Xcode, в neovim с использованием YouCompleteMe. Я надеюсь отправить запрос на перенос, чтобы решить эту проблему, но пока вы можете использовать clang_complete вместо YouCompleteMe. clang_complete имеет меньше функций, чем YouCompleteMe, и это не будущее завершения кода, но так сложилось, что его текущая интеграция с UltiSnips делает его автозаполнение кода Objective-C более похожим на Xcode, чем YouCompleteMe прямо сейчас.

Строить

Установить vim-dispatch

Plug 'tpope/vim-dispatch'   " Asynchronous build

Перезагрузите ~ / .nvimrc (или просто выйдите и перезапустите nvim), а затем запустите `: PlugInstall`. Надеюсь, вы тоже используете tmux. Почему? Потому что tmux потрясающий и избавляет от многих глупостей использования простой оболочки внутри графического интерфейса терминала:

Так что вперед и попробуйте:

brew install tmux

Затем в командной строке запустите tmux:

tmux attach || tmux new

Теперь, когда у вас есть vim-dispatch, вы можете заставить его запускать вашу команду xcodebuild в фоновой панели tmux, пока вы продолжаете код. Итак, вы cd в корневой каталог вашего проекта, открываете `nvim`, а затем устанавливаете переменную makeprg в вашу команду xcodebuild:

:set makeprg=xcodebuild\ -workspace\ LearningApp.xcworkspace\ -scheme\ Memories-iOS\ -configuration\ Debug

Если у вас есть .xcodeproj, а не .xcworkspace, используйте -project, а не -workspace. Если вы хотите указать симулятор, используйте -sdk iphonesimulator или укажите устройство с помощью -sdk iphoneos.

Чтобы сделать это автоматическим, у меня есть этот набор в моем .nvimrc:

if ( getcwd() == '/local/dev/memories_app')
    :set makeprg=xcodebuild\ -workspace\ LearningApp.xcworkspace\ -scheme\ Memories-iOS\ -configuration\ Debug
endif

Итак, если я запустил nvim из корневого каталога моего проекта memory_app, он установит для меня переменную makeprg.

Теперь, когда эта переменная установлена, просто запустите `: Make`, и vim-dispatch сделает свое волшебство.

Перейти к декларации / определению

Это идет с YouCompleteMe. Чтобы перейти к определению метода, наведите курсор на: YcmCompleter GoToDefinition. Для перехода к объявлению: YcmCompleter GoToDeclaration. Это довольно просто. Работает очень хорошо. Я сопоставил их, чтобы ускорить:

nnoremap <leader>d :YcmCompleter GoToDefinition <cr>
nnoremap <leader>s :YcmCompleter GoToDeclaration <cr>

Теперь я могу нажать ‹space› d, чтобы перейти к определению текущей функции, или, s, чтобы перейти к ее объявлению. Ваш ‹leader› ключ установлен в вашем ~ / .nvimrc.

.m / .h Переключение

Plug 'eraserhd/vim-ios'    ".h <-> .m switching and project build

После установки этого плагина вы можете использовать: A для переключения между текущим открытым файлом .h или .m. Обратите внимание, что это работает, только если файлы .h и .m имеют одно и то же имя (например, MyClass.h соответствует MyClass.m). Хотя это так в 99% случаев, в Objective-C допустимо называть ваши .h и .m по-разному.

Панель быстрого поиска (Shift + Cmd + O)

Сначала установите ag, средство быстрого поиска текста в файлах, такое как grep или ack:

brew install ag

Добавьте этот плагин в свой .nvimrc:

Plug 'kien/ctrlp.vim'  " quick search bar
" Make ctrlp a lot faster in git repositories
let g:ctrlp_user_command = ‘ag %s -i — nocolor — nogroup — hidden
 \ -g ""'
let g:ctrlp_use_caching = 0 “ ag is so fast that caching isn’t necessary
let g:ctrlp_max_files = 10000
let g:ctrlp_working_path_mode = 'r'   " Always use the current working directory rather than the location of the current file
let g:ctrlp_by_filename = 1 " Default to filename only search rather than searching the whole path.  This is more like Xcode's Shift+Cmd+O

Теперь, когда вы хотите работать над проектом, перейдите в корневой каталог проекта. Запустите vim и просто нажмите ‹c-p›, чтобы открыть панель быстрого поиска. Введите компоненты пути и / или имя файла, чтобы найти файл, который вы хотите начать редактировать, и нажмите клавишу ВВОД, чтобы перейти к нему.

Если в быстром поиске ctrlp отображаются какие-либо файлы, которые для вас не важны, создайте ~ / .agignore и добавьте его к нему вместе с любыми шаблонами, которые вы хотите игнорировать в своих проектах:

.git*
extern
*.test

Текстовый поиск в рамках проекта

Вы установили ag ранее. Теперь вы будете использовать его для поиска по всему проекту. В вашем ~ / .nvimrc:

Plug 'rking/ag.vim'  " ag support for searching file
" Outside your plugin definitions:
:command! -nargs=+ S :Ag! "<args>"
:command! -nargs=+ Sm :Ag! --matlab --ignore=*Test* --ignore=_* "<args>"
:command! -nargs=+ St :Ag! --matlab --ignore=*Test* --ignore=_* --ignore=*Tool* "<args>"

Теперь вы можете набрать `: S myString` для рекурсивного поиска« myString »в каждом файле в вашем текущем каталоге и во всех его подкаталогах. Эта вторая команда позволяет вам выполнять `: Sm myString` для поиска только внутри файлов .m, игнорируя любые файлы модульного тестирования и сгенерированные классы.

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

nnoremap <leader>j :cn<CR>
nnoremap <leader>k :cp<CR>

С их помощью вы можете нажать Control-j, чтобы перейти к следующему результату, и Control-k, чтобы перейти к предыдущему результату.

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

" In your plugins
Plug 'Valloric/ListToggle'                  " Toggle the display of the location and quickfix windows
" Later in your .nvimrc:
let g:lt_location_list_toggle_map = '<leader>l'
let g:lt_quickfix_list_toggle_map = '<leader>q'

Фрагменты кода

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

Plug 'SirVer/ultisnips'        "code snippets
" UltiSnips
" The below key bindings are compatible with YouCompletMe integration
let g:UltiSnipsExpandTrigger="<c-j>"
let g:UltiSnipsJumpForwardTrigger="<c-j>"
let g:UltiSnipsJumpBackwardTrigger="<c-k>"

Теперь, когда вы редактируете файл, вы будете получать дополнения кода от YouCompleteMe, которые включают фрагменты кода UltiSnips в конце списка:

Выберите нужный вариант, нажмите ‹c-j›, и вы получите:

Обратите внимание: если вы только что установили neovim и настраиваете его впервые, ваши цвета с самого начала не будут выглядеть так красиво. В своих мыслях о выборе подходящего терминала для Mac я упоминаю, как настроить эти цветовые схемы.

Чтобы создать сниппет, откройте любой файл и выполните: UltiSnipsEdit. Откроется соответствующий файл ‹filetype› .snippets, который вы сможете отредактировать. В качестве примера в Objective-C вы можете добавить сниппет dispatch_once, добавив его в этот файл:

snippet dispatch_once
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
 $1 
});
endsnippet

Я сохраняю эти фрагменты синхронизированными между машинами, имея эту папку Ultisnips в моем Dropbox, а затем у меня есть символическая ссылка на нее, где Ultisnips ее ищет:

ln -s ~/Dropbox/config/Ultisnips ~/.nvim/Ultisnips

Завершение кронштейна

Когда вы пишете if (совершенно очевидно, что вы хотите, чтобы скобка заполнялась автоматически :), так же, как это делается в Xcode. Добавьте для этого этот плагин:

Plug 'Raimondi/delimitMate'    " Automatically insert closing brackets

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

[NSFileManager defaultManager]<cursor here>

а потом продолжаю набирать:

[NSFileManager defaultManager] removeFileAtPath:MYPATH];

И Xcode достаточно хорош, чтобы поставить [в начале строки. Это не всегда работает в Xcode, но в vim у меня есть решение, которое может быть не таким автоматическим, но оно всегда работает:

Plug 'tpope/vim-surround' " Add, remove, and change surrounding characters in pairs

Теперь, когда вы находитесь в ситуации, описанной выше, вы можете нажать yssr, чтобы автоматически заключить эту строку в []. Узнайте больше о том, что стало возможным с vim-Surround с помощью `: h Surround`.

Выделить переменную под курсором

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

Plug 'qstrahl/vim-matchmaker'   " Highlight the term under the cursor

Затем в нижней части ~ / .nvimrc:

" Underline words matched by Matchmaker
function! ToggleMatchmaker()
    " Don’t show matches in non-code files
    if &ft =~ ‘objc\|objcpp\|python\|cpp’
        Matchmaker
    else
        " Specifically, I want it disabled on help, mkd
        Matchmaker!
    endif
endfun
autocmd BufEnter * call ToggleMatchmaker()
highlight Matchmaker guibg=NONE
highlight Matchmaker gui=underline
highlight Matchmaker ctermbg=NONE
highlight Matchmaker cterm=underline

Теперь вы можете видеть, что переменная под курсором подчеркнута:

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

С вашей установкой llvm36 на Hombrew, описанной выше, пришел форматировщик кода clang `clang-format`. Установите плагин vim, который будет использовать его для автоматического форматирования кода по мере его написания:

Plug 'Chiel92/vim-autoformat'  " Auto-format code using existing formatters

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

" Autoformat 4 seconds after the user’s cursor stops moving in normal mode

autocmd FileType objc,objcpp autocmd InsertLeave <buffer> :silent Autoformat

Автосохранение

Вам не нужно постоянно: w сохранять буфер. Итак, в вашем ~ / .nvimrc:

autocmd BufUnload,BufLeave,FocusLost,QuitPre,InsertLeave,TextChanged,CursorHold * silent! wall

Автоматическое сохранение / загрузка сеанса

У вас должна быть возможность выйти и войти в NeoVim и начать с того места, где вы остановились. Для этого в вашем ~ / .nvimrc:

Plug 'xolox/vim-session'    " Save and restore vim state
:PlugInstall

Теперь, когда он установлен, настройте его на автоматическое сохранение в текущий каталог и автоматическую загрузку:

" vim-session {{{
let g:session_directory = getcwd()    " The session directory is always the current directory. This should allow save and restory on a per project basis
let g:session_default_name = ".vim-session"
let g:session_autoload = 'yes'
let g:session_autosave = 'yes'
let g:session_lock_enabled = 0
""" }}}

Что у вас есть сейчас

На данный момент я никогда не открываю Xcode для написания кода или сборки. Так получилось, что я не использую его для отладки, потому что Xcode не поддерживает ситуации, когда мне нужна отладка, поэтому я все равно использую командную строку. Это 95% того, что собирается делать программист. Единственный раз, когда я открываю Xcode, - это редактирование некоторого мусора Xcode, который предназначен только для графического интерфейса пользователя, например раскадровки, моделей Core Data и списков. Их просто проще редактировать в формате графического интерфейса пользователя. Когда Xcode достаточно здоров, чтобы открыть мою раскадровку и отредактировать ее, не обижая меня, тогда жизнь станет прекрасной.

СДЕЛАТЬ

Было бы действительно здорово, если бы кто-нибудь написал плагин neovim, который использует xcodeproj для автоматизации всех специфичных для проекта настроек для сборки, установки, запуска, тестирования, очистки, отладки и анализа.

Подсветка синтаксиса

Приведенный выше файл cocoa.vim, который вы установили, должен предоставить vim достаточно информации, чтобы правильно выделить различные аспекты кода: классы, типы, операторы и т. Д. Цвета, выбранные для каждой сущности, определяются вашей цветовой схемой.

TODO: выделение синтаксиса пользовательских символов.

TODO: Создайте красивую цветовую схему.

TODO: Возможно, лучше, чем cocoa.vim, который не выполняет автогенерацию, - это просто использовать easytags.

Анализировать

СДЕЛАТЬ

Запустить модульные тесты

TODO: См. Здесь.

Беги в симуляторе

ЗАДАЧА: используйте simctl.

Запуск на устройстве

TODO: Используйте ios-deploy.

Отладка

Рассмотрите возможность использования vim-lldb.

ЗАДАЧА: Для симулятора:

% lldb
 (lldb) process attach -n 'Name Of Your App' --waitfor
 <launch your app in the simulator>
 (lldb) continue

Консольное ведение журнала

TODO: Одно из решений см. Здесь.

Список оценок метода и прагмы

Установите плагин cocoa.vim:

Plug 'jgoulah/cocoa.vim'           " method list, documentation

Теперь вы можете запустить: ListMethods, чтобы получить список всех прагматических меток и методов в текущем файле. Нажмите Enter в строке, чтобы перейти к этому методу:

TODO: Прямо сейчас я считаю, что cocoa.vim чрезвычайно неэффективен с точки зрения производительности, вероятно, из-за попыток подсветки синтаксиса.

Правильнее будет использовать `brew install ctags` с vim-easytags . На данный момент у него просто нет конфигурации для Objective-C, поэтому мне просто нужно выполнить это, и он должен работать очень хорошо.

Просмотр документации

Просмотр документации также обеспечивается плагином cocoa.vim. Нажмите K, чтобы открыть документацию по символу под курсором.

ТОДО: исправить плагин. Сейчас это работает некорректно.

Почему неовим?

Это здесь в виде сноски, потому что я думаю, что это наименее важно. На данный момент мне это кажется совершенно очевидным. Я использую neovim ~ 14 часов программирования каждый день (да, часто и по выходным) вот уже 6 месяцев. Я могу вспомнить, что за весь тот период времени он разбился ВСЕГО дважды. Это целых два раза. В обоих случаях я отправил отчет об ошибке против neovim, и был мгновенный ответ. В отличие от vim, neovim станет практически невозможным сбой даже с установленными мошенническими плагинами. О, что это было? Стон уродливого старого Xcode вон там, в углу? * тьфу *

Конечно, вам придется научиться, если вы новичок в vim. Ну и что. Ты стар и глупеешь. Измените это, изучая новые вещи, которые просто лучше. Нет абсолютно никаких сомнений в том, что я намного счастливее и продуктивнее в neovim, и я ежедневно использую его как первоклассную IDE для C ++, Python и Objective-C.

Почему не emacs? Я уверен, что emacs может делать все то же самое. Попробуйте, если он держит вашу лодку на плаву. Решение neovim сводилось к двум вещам: 1) модальные привязки клавиш neovim нравятся мне по сравнению с привязками клавиш emacs. 2) Сообщество и авторы проекта офигенно звездные. Они делают все правильно, и это превращается в звездную базу кода со звездными функциями.

Почему не vim? * ОБЪЕДИНЯЕТ ВОДУ ПО ВСЕЙ СТЕНЕ vim - это отвратительная куча дерьма, которую поддерживает гремлин. У него даже нет асинхронной модели плагина…. ?????!?!?!? ›!›!? !! ›! ››! N! IU! $ IUG (T Это 2015 год, черт возьми программа. neovim - это повсюду долбаная программа.