конфигурирование emacs для cmake

gcc 4.4.2 cmake 2.6

Я только что начал использовать cmake. Прибытие из записи моих собственных Make-файлов.

Однако у меня есть эта структура каталогов и использование сборки из источника. Разделить исходные файлы от файлов типа "build".

project
    src
        my_c_files.c
        CMakeLists.txt
    build
        Makefile

Прежде чем я записал бы свои собственные Make-файлы в src каталоге и затем нажал бы F5, и я смог скомпилировать свою программу. И emacs перечислил бы любое предупреждение или ошибки. Однако кажется, что я должен открыть терминал и перейти к каталогу сборки для выполнения

cmake ../src

и затем

make

Я хотел бы работать, делают из emacs то же как нажатие F5. Но поскольку Make-файл, как сгенерировано в каталоге сборки и emacs ищет его в src каталоге.

Даже когда я установил гибкую ссылку на Make-файл в src каталоге для соединения с Make-файлом в каталоге сборки. Все это сделало был, дают мне список ошибок.

22
задан Aaron Hall 28 July 2017 в 19:20
поделиться

5 ответов

Я нашел. Свойство «namePattern» должно быть определено для создания входных данных с другим именем.

За бывшее:

<input type="file" accept="gif|jpg|jpeg|png" />


<script language="javascript" type="text/javascript">
        $(document).ready(function () {
            $i = (1, 2, 3, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20);
            $(':file').MultiFile({ namePattern: '$name_$i', maxlength: 20 });
        });  
</script>

Тем не менее, спасибо за помощь.

-121--3842739-

Вот еще один способ сделать это, используя ogrid , который немного быстрее:

import numpy as np
import Image

w, h = 600, 800
sq = 15
color1 = (0xFF, 0x80, 0x00)
color2 = (0x80, 0xFF, 0x00)

def use_ogrid():
    coords = np.ogrid[0:w, 0:h]
    idx = (coords[0] // sq + coords[1] // sq) % 2
    vals = np.array([color1, color2], dtype=np.uint8)
    img = vals[idx]
    return img

def use_fromfunction():
    img = np.zeros((w, h, 3), dtype=np.uint8)
    c = np.fromfunction(lambda x, y: ((x // sq) + (y // sq)) % 2, (w, h))
    img[c == 0] = color1
    img[c == 1] = color2
    return img

if __name__ == '__main__':
    for f in (use_ogrid, use_fromfunction):
        img = f()
        pilImage = Image.fromarray(img, 'RGB')
        pilImage.save('{0}.png'.format(f.func_name))

Вот временные результаты:

% python -mtimeit -s"import test" "test.use_fromfunction()"
10 loops, best of 3: 307 msec per loop
% python -mtimeit -s"import test" "test.use_ogrid()"
10 loops, best of 3: 129 msec per loop
-121--2111426-

Точно для той же цели я нашел .dir-locals.el чрезвычайно полезным, вот как один из моих выглядит так:

((nil . ((tab-width . 8)
     (indent-tabs-mode . t)))
 (c++-mode . ((c-basic-offset . 8)
          (tab-width . 8)
          (indent-tabs-mode . t)
          (compile-command . "make -C ../build -j 2 run_tests")))
 ((c-mode . ((c-basic-offset . 8)
         (tab-width . 8)
         (indent-tabs-mode . t)
         (compile-command . "make -C ../build -j 2 run_tests")))))

Очевидно, что я могу иметь пути, указанные в различных .dir _ locals.el в соответствии с их расположением и, например, некоторые сборки запустить _ тесты для модульного теста, некоторые построить реальную цель и так далее.

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

all: run_tests

run_tests:
    @cmake ..
    @make -j 2

Этот путь я могу сделать извлечение и просто запустить M-x compile в любом файле, который мне нравится, и он будет делать правильные вещи. Я использую git и имею, что Makefile игнорировал от мониторинга по git как так:

git update-index --ассуме-неизмененный Makefile

, и если я хочу изменить и зафиксировать его я делаю

git update-index --no-talk-instanged Makefile .

Таким образом, только что созданный cmake Makefile не покажет в git статус как измененный, и я не совершу его случайно.

Преимущества этого подхода:

  • так как cmake использует абсолютные пути внутри, нет абсолютно никаких проблем с переходом через ошибки компиляции в буфере компиляции, просто нажимая на них enter.

  • Вы можете указать любые правила отступа, которые вы хотите там, и они могут быть разными в различных проектах или даже каталогах, если вы хотите:)

  • Вы можете указать любое количество целевых объектов в различных проектах, даже каталогах, по-прежнему использовать одну и ту же старую компиляцию M-x (я привязан к C-c b ) и заставить Emacs сделать правильную вещь

Единственным недостатком является наличие .dir-locals.el в ваших подкаталогах, которые я вряд ли нахожу плохими.

EDIT: robUK, чтобы ответить на ваш комментарий:

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

EDIT2: liwp, чтобы ответить на ваш вопрос:

Как уже указал Чарльз, и как говорится в документации:

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

Вам не нужно .dir-locals.el везде в дереве проекта. Примечание,однако это, вероятно, зависит от сложности базовой структуры кода.

Обычно я бы пошел на довольно простую компоновку так:

/project_root_dir
    /build
    /src
    /test

и у меня были бы немного другие цели, указанные в разных .dir-locals.el , скажем в /test Я бы только построил testrunner и выполнил бы его, я бы потратил большую часть времени на разработку, построив эту цель. Тогда в /src я бы сначала построил тот же самый testrunner , исполнил бы его, и если бы там все прошло хорошо, это построило бы мне мою главную цель проекта. Если вам это не нужно, вы можете быть в порядке только с одним .dir-locals.el в разделе /project _ root _ dir . Если исходная структура и требования гораздо более сложны, это может означать, что вам потребуется несколько больше мастера, связанного с путями и целями.

25
ответ дан 29 November 2019 в 04:20
поделиться

Вы можете изменить текущий рабочий каталог, который EMACS использует с M-X CD <Путь для создания dir> . После этого, когда вы запустите компиляцию M-X , make будут выполняться в новом рабочем каталоге. Это эффективно так же, как работает на терминал в каталоге сборки, поэтому он должен работать для вас просто в порядке.

2
ответ дан 29 November 2019 в 04:20
поделиться

На самом деле, вы можете использовать метод .live. У вас нет свойства event.touches из-за внутренней обработки событий jQuery. Чтобы «исправить» события, jQuery клонирует событие. При этом копируется только ограниченное количество свойств по причинам производительности. Однако получить доступ к исходному объекту события можно с помощью свойства event.origingEvent.

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

$('a').live('touchend', function(event) {
  event.preventDefault();
  console.log(event.originalEvent.touches.length);
});

Вот свойства, которые копируются поверх: http://github.com/jquery/jquery/blob/master/src/event.js#L411

-121--4155991-

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

Поэтому взаимодействие с виджетами очень ограничено.

Дело в том, что виджеты не являются «мини-приложениями», они... виджеты. Они живут в мире и зависят от реального применения, содержащего их.

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

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

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

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

-121--3565938-

Более общее решение для команды compile:

cd ${PWD%/src/*}/build && cmake ../src && make

Переменная среды PWD содержит каталог, в котором находится редактируемый файл; расширение с помощью %/src/* возвращает вас к корню проекта, не беспокоясь о том, сколько ../ вам нужно.

9
ответ дан 29 November 2019 в 04:20
поделиться

Я использую EDE из Cedet для настройки проектов для работы с CMake. Взгляните в мою CEDET-конфигурацию, начиная со строки 105, например, код для настройки проекта. Я использую отдельные каталоги Debug & Release для разных сборок, и по умолчанию компиляция выполняется только для Debug mode.....

4
ответ дан 29 November 2019 в 04:20
поделиться

Измените команду на использование абсолютного, а не относительного патча. EG:

cmake ~/workspace/project/src && make
1
ответ дан 29 November 2019 в 04:20
поделиться
Другие вопросы по тегам:

Похожие вопросы: