Как сделать символ " ^ " в MATLAB?

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

есть ли способ добавить его на панель инструментов MATLAB (например, в Excel, чтобы вы могли использовать его с помощью мыши или тачпада) или определить пользовательский ключ (например, F12) в MATLAB для его замены?

Я надеюсь на не АХК решение, и как.

6 ответов


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

clipboard('copy','^')

запуск этого разместит символ экспоненты ^ в буфер обмена. Как только вы нажмете его, сделайте Ctrl+V вставить.

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


В Windows (с Num Lock on), удерживайте нажатой Alt, тип 94 на цифровой клавиатуре, и освободить Alt. The ^ будет вставлен в позицию курсора.

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

на ^ символ U+5E, которая составляет 94 в десятичное.


Я бы предложил загрузить представление EditorMacro С Яир Альтман на Обмен Файлами MathWorks. Если вы запустили следующий код в окне команды MATLAB (в то время как редактор MATLAB был открыт):

EditorMacro('Alt 6','^');

он создаст макрос в контексте редактора MATLAB и командного окна, который вставит строку ^ в положении каретки, когда вы нажмете комбинацию клавиш Alt+6 (который не должен быть привязан к любому другому макро/операции, насколько я знаю).

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

так как макросы сделаны с EditorMacro удаляются каждый раз, когда MATLAB закрыт, вы можете создать (который будет автоматически запускаться при каждом открытии MATLAB), чтобы создать макросы для вас. Файл может выглядеть примерно так:

edit;                      %# Open the Editor so EditorMacro works properly
EditorMacro('Alt 5','%');  %# Create "%" macro
EditorMacro('Alt 6','^');  %# Create "^" macro
EditorMacro('Alt 7','&');  %# Create "&" macro
...

в этом примере, я в основном воспроизводящие поведение Shift плюс число на английской клавиатуре используя Alt вместо.


и если все остальное терпит неудачу...

вы всегда можете использовать функциональные формы арифметических операторов в крайнем случае:

  • power(A,B) вместо элементарной операции питания A.^B
  • mpower(A,B) вместо работы матричного питания A^B

это не будет красиво, но это сработает.


какая клавиатура у вас есть, что она не включена?

http://msdn.microsoft.com/en-us/goglobal/bb964651.aspx

мы сделали быструю проверку после просмотра этого вопроса и не смогли найти клавиатуру без символа.

поговорил с нашей командой MATLAB I18N об этом и поставил запрос на улучшение.


- ладно... Вот хак, который позволяет переназначать произвольные нажатия клавиш в окне команды и Редакторе Matlab. Это неподдерживаемый hack, который включает в себя недокументированные внутренности IDE. Но это "магия", как ты и надеялся. Работает в R2008b и R2009b для меня.

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

package test;

import java.awt.event.ActionEvent;
import java.awt.event.KeyEvent;
import javax.swing.text.JTextComponent;
import javax.swing.text.TextAction;

/**
 * An action that responds to an event with another keystroke.
 */
public class KeyReplacementAction extends TextAction {

    private final char replacement;

    /**
     * @param name Name of this action (ignored in practice)
     * @param replacement char to replace the event with
     */
    public KeyReplacementAction(String name, char replacement) {
        super(name);
        this.replacement = replacement;
    }

    public void actionPerformed(ActionEvent e) {
        if (!(e.getSource() instanceof JTextComponent)) {
            return;
        }
        JTextComponent src = (JTextComponent) e.getSource();
        KeyEvent replacementEvent = new KeyEvent(src, KeyEvent.KEY_TYPED, 
                java.lang.System.currentTimeMillis(), 0,
                KeyEvent.VK_UNDEFINED, replacement);
        src.dispatchEvent(replacementEvent);
    }

}

Теперь, используйте код Matlab, чтобы копаться в виджетах Swing IDE, находить карты клавиш для окна редактора и команды и добавлять обработчики для их переназначения.

function remap_keys_in_text_areas()
%REMAP_KEYS_IN_TEXT_AREAS Custom key remapping in Matlab GUI text areas
%
% Must be called after the editor is open, otherwise it won't find the
% editor keymap.

% { from, to; ... }
% Try "disp(char(1:1024))" to see all chars that work in your Matlab font
map = {
    '$' '^'
    '#' char(181)  % might be useful for text formatting
    };

make_sure_editor_is_open(); % otherwise we won't find its keymap

keymaps = find_ide_keymaps();
for i = 1:size(map,1)
    [from,to] = map{i,:};
    disp(sprintf('Re-binding %s to %s in text areas', from, to));
    for j = 1:numel(keymaps)
        bind_keystroke_for(keymaps{j}, from, to);
    end
end

function make_sure_editor_is_open()
s = find_editor_widgets();
if isempty(s.editors)
    edit;
end

function bind_keystroke_for(keymap, from, to)
%BIND_KEYSTROKE_FOR Remap a single keystroke in a text component

import javax.swing.KeyStroke;
import java.awt.event.InputEvent;
import test.KeyReplacementAction;

key = javax.swing.KeyStroke.getKeyStroke(from);
action = KeyReplacementAction(['remap ' from ' to ' to], to);
keymap.addActionForKeyStroke(key, action);

function out = find_ide_keymaps
%FIND_IDE_KEYMAPS Find keymap objects for Matlab IDE widgets
set = java.util.HashSet();
s = find_editor_widgets();
widgets = [s.cmdwin s.editors];
for i = 1:numel(widgets)
    set.add(widgets{i}.getKeymap());
end
set = set.toArray();
out = cell(size(set));
for i = 1:numel(set)
    out{i} = set(i);
end

function out = find_editor_widgets
%FIND_EDITOR_WIDGETS Find editor and command window widgets in Matlab Swing GUI
out.cmdwin = [];
out.editors = {};
wins = java.awt.Window.getOwnerlessWindows();
for i = 1:numel(wins)
    if isa(wins(i), 'com.mathworks.mde.desk.MLMainFrame')
        out.cmdwin = get_command_window_from_mainframe(wins(i));
    elseif isa(wins(i), 'com.mathworks.mde.desk.MLMultipleClientFrame')
        out.editors = [out.editors get_text_areas_from_editor_frame(wins(i))];
    end
end

function out = get_command_window_from_mainframe(frame)
out = findobj_swing_widget(frame, 'com.mathworks.mde.cmdwin.XCmdWndView');

function out = get_text_areas_from_editor_frame(frame)
out = findobj_swing_widget(frame, 'com.mathworks.widgets.SyntaxTextPane');

function out = findobj_swing_widget(widget, klass)
%FINDOBJ_SWING_WIDGET Recursively find all child components of given class
out = {};
if isa(widget, klass)
    out{end+1} = widget;
end
for i = 1:widget.getComponentCount()
    out = [out findobj_swing_widget(widget.getComponent(i-1), klass)];
end

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

>> remap_keys_in_text_areas
Re-binding $ to ^ in text areas
Re-binding # to µ in text areas

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

a^b ≡ exp(b*ln(a))

Я как раз собирался предложить C-style POWER(A,B) функция для замены функциональности ^ оператора, но gnovice опереди меня. Я бы предположил, что это то, что POWER(A,B) и MPOWER(A,B) функции на основе.

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