#vim #autocmd
#vim #autocmd
Вопрос:
Текущая gfкоманда откроет файлы * .pdf в виде текста ascii. Я хочу, чтобы PDF-файл открывался с помощью внешних инструментов (например, okular, foxitreader и т. Д.). Я попытался использовать autocmd для достижения этого следующим образом:
au BufReadCmd *.pdf silent !FoxitReader % amp; "open file under cursor with FoxitReader
au BufEnter *.pdf <Ctrl-O> "since we do not really open the file, go back to the previous buffer
Однако второй autocmd не сработал должным образом. Я не мог найти способ выполнить <Ctrl-o>
команду таким autocmd
образом.
Может ли кто-нибудь дать мне подсказку о том, как <Ctrl-O>
войти autocmd
, или просто напрямую предложить лучший способ открытия PDF-файлов с gfпомощью?
Спасибо.
Ответ №1:
Это потому, что за an autocmd
следует команда ex (те, которые начинаются с двоеточия). Чтобы имитировать выполнение команды обычного режима, используйте :normal
команду. Проблема в том, что вы не можете передать a <C-O>
(и not <Ctrl-O>
) напрямую :normal
, он будет восприниматься как буквальные символы (< , затем C, затем r), что является не очень значимой обычной командой. У вас есть два варианта:
1. Вставьте буквенный символ ^O
Используйтеcontrolvcontrolo, чтобы получить один:
au BufEnter *.pdf normal! ^O
2. Используйте :execute
для создания вашей команды
Таким образом, вы можете получить более читаемый результат с экранированной последовательностью:
au BufEnter *.pdf exe "normal! <c-o>"
В любом случае, это не самая подходящая команда. <C-O>
просто перейдите к
предыдущему местоположению в списке переходов, поэтому ваш буфер остается открытым. Я бы сделал
что-то вроде:
au BufEnter *.pdf bdelete
Вместо этого. Тем не менее, у меня есть другое решение для вас.
Создайте другую команду, скажем, с картойgO. Затем используйте программу чтения PDF напрямую или утилиту, например open
, если вы используете macOS X или Darwin (не уверен, есть ли она в других системах Unix и как она называется). Это все равно, что дважды щелкнуть значок файла, переданного в качестве аргумента, поэтому откроется программа чтения PDF по умолчанию или любое другое приложение, настроенное на открытие любого файла по умолчанию, например изображений или около того.
:nnoremap gO :!open <cfile><CR>
Это <cfile>
будет расширено до файла под курсором. Итак, если вы хотите
открыть файл в Vim, используйте gf. Если вы хотите открыть его с
помощью приложения по умолчанию, используйте gO.
Если у вас нет этой команды или вы предпочитаете решение только для PDF, создайте сопоставление с вашей предпочтительной командой:
:nnoremap gO :!FoxitReader <cfile> amp;<CR>
Комментарии:
1. Спасибо! Ваше предложение с autocmd работает. Однако, когда я попробовал решение ‘gO’ с FoxitReader (я не нашел эквивалентной программы open в моем дистрибутиве Linux), FoxitReader просто сообщил «Файл не найден». Кажется, <cfile> был расширен неправильно. Есть еще предложения?
2. Рад помочь @Liang! В ситуации, когда
gO
не работает,gf
работает ли? С<cfile>
ним должно быть то же самое. Возможно, файл не находится в текущем каталоге, в котором вы находитесь, или что-то в этом роде.3. Это связано с проблемой пути! Тем не менее,
gf
проблема не возникает, хотяgO
и возникает. В моем случае у меня был файл bibtex~/papers/library.bib
, и все PDF-файлы находились в одном каталогеpapers
. Когда я открыл файл bib из$HOME
,gf
сработал иgO
потерпел неудачу; Когда я открыл его изpapers
каталога, оба решения сработали.4. к сожалению
gO
, решение имеет проблемы при работе с именами файлов, которые содержат пробелы.5. Поведение при удалении окон
:bdelete
было для меня неприемлемым, и я переключился на github.com/qpkorr/vim-bufkill (он удаляет буферы без закрытия окон).
Ответ №2:
Если приложение по умолчанию приемлемо, то работает простое использование :!open %
в командном режиме. Вы всегда можете сопоставить это с подходящей комбинацией выноски в вашем файле конфигурации vim и т. Д.
Если вам нужно что-то, что работает в обычном режиме, вы можете попробовать что-то вроде следующего (я тоже использую это для открытия HTML-файлов) и изменить в соответствии с вашими потребностями:
if has('win32') || has ('win64')
autocmd FileType html nmap <Leader>g :silent ! start firefox "%"<cr>
elseif has('mac')
autocmd FileType html nmap <Leader>g :!open "%"<cr><cr>
endif
Комментарии:
1. Я использовал
:nnoremap gO :!xdg-open <cfile><CR>
, и он открывает файлы с помощью связанного по умолчанию приложения, но не файлы с a@
в пути, например~/jim@webaddress.mail/paper.pdf
, он захватывает только бит после@
.help <cfile>
не говорит о многом. Кавычки вокруг<cfile>
, подобные этому"<cfile>"
, не помогают. Есть идеи?