Salut camarade ergodoniste,
Attention, je ne pensais pas diffuser ça un jour, j'ai vraiment fait à l'arrache. ^^
Pas de pb pour mon layout, mais je me permets de dégager 4 macros, pour des raisons de ...heu... disons confidentialité J'ai remplacé les trucs que je ne voulais pas diffuser par "SUP" .
Déjà,
mon layout de base
Mis en garde. Je suis bépoiste, pas QMK! SEND_STRING("qwerty" ), sur un ordi en qwerty donnera qwerty, mais sur un ordi bépo ça donnera bépoè^. La manière la plus facile que j'ai trouvée pour rédiger mes macros est de taper à l'aveugle mes caractères, comme si j'étais en bépo, mais sur l'ordi configuré en Qwerty. Pour résumes, pour avoir par exemple "question" il faut écrire "msfljdr;"
Mon keymap.c.
#include QMK_KEYBOARD_H
#include "keymap_bepo.h"
// keymaps
#define BEPO 0 // default layer, for bepo compatible systems
#define FNAV 1 // function / navigation / mouse layer
#define NUMK 3 // numeric keypad layer
// Spécials
#define MK_CUT LSFT(KC_DEL) // shift + delete
#define MK_COPY LCTL(KC_INS) // ctrl + insert
#define MK_PASTE LSFT(KC_INS) // shift + insert
// macros
#define KP_00 0 // keypad "double 0"
#define KP_QUESTION 1 // Question réponse
#define KP_LINE 2 // Fine de ligne audition
#define KP_PLANCHE 3 // Macro utilisée pour les planches sous Linux CTRL+MAJ+PSCREEN
//SUP
// The Tap Dance identifiers, used in the TD keycode and tap_dance_actions array.
#define TAP_MACRO 0
// Custom keycodes
enum {
// SAFE_RANGE must be used to tag the first element of the enum.
// DYNAMIC_MACRO_RANGE must always be the last element of the enum if other
// values are added (as its value is used to create a couple of other keycodes
// after it).
DYNAMIC_MACRO_RANGE = SAFE_RANGE,
};
// This file must be included after DYNAMIC_MACRO_RANGE is defined...
#include "dynamic_macro.h"
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
/* Keymap 0: default layer
*
* ,--------------------------------------------------. ,--------------------------------------------------.
* | $ | « | » | " | ( | ) |Delete| |SUP | @ | + | - | / | * | = |
* |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------|
* | % | B |E_ACUT| P | O |E_GRAV|Backsp| |QUEST | ^ | V | D | L | J | Z |
* |--------+------+------+------+------+------| ace | | |------+------+------+------+------+--------|
* | W | A | U | I | E | , |------| |------| C | T | S | R | N | M |
* |--------+------+------+------+------+------| Tab | | LINE |------+------+------+------+------+--------|
* | MACRO |A_GRAV| Y | X | . | K | | | | ' | Q | G | H | F | C_CEDIL|
* `--------+------+------+------+------+-------------,-------------. ,-------------`-------------+------+------+------+------+--------'
* |Escape|Insert|LSuper| LCtrl| LAlt| |PLANCHE|SUP | |SUP | SUP | | AltGr| RCtrl|RSuper|PrntSc| Pause|
* `----------------------------------' ,------|------|------| |------+------+------. `----------------------------------'
* | | |L_NumK| |L_NumK| | |
* | Space|LShift|------| |------|RShift|Enter |
* | | |L_FNav| |L_FNav| | |
* `--------------------' `--------------------'
*/
[BEPO] = LAYOUT_ergodox(
// Left hand
BP_DOLLAR, BP_LGIL, BP_RGIL, BP_DQOT , BP_LPRN, BP_RPRN, KC_DEL,
BP_PERCENT, BP_B, BP_E_ACUTE, BP_P, BP_O, BP_E_GRAVE, KC_BSPC,
BP_W, BP_A, BP_U, BP_I, BP_E, BP_COMMA,
TD(TAP_MACRO), BP_A_GRAVE, BP_Y, BP_X, BP_DOT, BP_K, KC_TAB,
KC_ESC, KC_INS, KC_LGUI, KC_LCTL, KC_LALT,
M(KP_PLANCHE), BP_S,
MO(NUMK),
KC_SPC, KC_LSHIFT, MO(FNAV),
// Right hand
BP_S, BP_AT, BP_PLUS, BP_MINUS, BP_SLASH, BP_ASTR, BP_EQUAL,
M(KP_QUESTION), BP_DCRC, BP_V, BP_D, BP_L, BP_J, BP_Z,
BP_C, BP_T, BP_S, BP_R, BP_N, BP_M,
M(KP_LINE), BP_APOS, BP_Q, BP_G, BP_H, BP_F, BP_CCED,
BP_ALGR, KC_RCTL, KC_RGUI, KC_PSCREEN, KC_PAUSE,
BP_S, BP_S,
MO(NUMK),
MO(FNAV), KC_RSHIFT, KC_ENTER),
/* Keymap 1: function / navigation / mouse layer
*
* ,--------------------------------------------------. ,--------------------------------------------------.
* | | F1 | F2 | F3 | F4 | F5 |VolMut| | | F6 | F7 | F8 | F9 | F10 | |
* |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------|
* | | Next |LClick| Up |RClick| WhUp |VolDwn| | | PgUp | Home | Up | End | F11 | |
* |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
* | | Prev | Left | Down | Right|WhDown|------| |------| PgDn | Left | Down | Right| F12 | |
* |--------+------+------+------+------+------| VolUp| | |------+------+------+------+------+--------|
* | | Undo | Cut | Copy | Paste| | | | | | | | | | |
* `--------+------+------+------+------+-------------,-------------. ,-------------`-------------+------+------+------+------+--------'
* | | | | | | | | | | | | | | | | | |
* `----------------------------------' ,------|------|------| |------+------+------. `----------------------------------'
* | | | | | | | |
* | | |------| |------| | |
* | | | | | | | |
* `--------------------' `--------------------'
*/
[FNAV] = LAYOUT_ergodox(
// Left hand
KC_NO, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_MUTE,
KC_NO, KC_MS_BTN5, KC_MS_BTN1, KC_MS_UP, KC_MS_BTN2, KC_MS_WH_UP, KC_VOLU,
KC_NO, KC_MS_BTN4, KC_MS_LEFT, KC_MS_DOWN, KC_MS_RIGHT, KC_MS_WH_DOWN,
KC_NO, KC_UNDO, MK_CUT, MK_COPY, MK_PASTE, KC_NO, KC_VOLD,
KC_NO, KC_NO, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS,
KC_TRNS,
KC_NO, KC_TRNS, KC_TRNS,
// Right hand
KC_NO, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_NO,
KC_NO, KC_PGUP, KC_HOME, KC_UP, KC_END, KC_F11, KC_NO,
KC_PGDOWN, KC_LEFT, KC_DOWN, KC_RIGHT, KC_F12, KC_NO,
KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO,
KC_TRNS, KC_TRNS, KC_TRNS, KC_NO, KC_NO,
KC_TRNS, KC_TRNS,
KC_TRNS,
KC_TRNS, KC_TRNS, KC_NO),
/* Keymap 2: numeric keypad layer, sends keypad codes
*
* ,--------------------------------------------------. ,--------------------------------------------------.
* | | | | | | | | | | | NumLo| / | * | - | |
* |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------|
* | | | | | | | | | | | 7 | 8 | 9 | + | |
* |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
* | | | | | | |------| |------| | 4 | 5 | 6 | + | |
* |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
* | | | | | | | | | | | 1 | 2 | 3 | Enter| |
* `--------+------+------+------+------+-------------,-------------. ,-------------`-------------+------+------+------+------+--------'
* | | | | | | | | | | | | | 0 | 00 | . | Enter| |
* `----------------------------------' ,------|------|------| |------+------+------. `----------------------------------'
* | | | | | | | |
* | | |------| |------| | |
* | | | | | | | |
* `--------------------' `--------------------'
*/
[NUMK] = LAYOUT_ergodox(
// Left hand
KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO,
KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO,
KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO,
KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO,
KC_NO, KC_NO, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS,
KC_TRNS,
KC_NO, KC_TRNS, KC_TRNS,
// Right hand
KC_NO, KC_NO, KC_NUMLOCK, KC_KP_SLASH, KC_KP_ASTERISK, KC_KP_MINUS, KC_NO,
KC_NO, KC_NO, KC_KP_7, KC_KP_8, KC_KP_9, KC_KP_PLUS, KC_NO,
KC_NO, KC_KP_4, KC_KP_5, KC_KP_6, KC_KP_PLUS, KC_NO,
KC_NO, KC_NO, KC_KP_1, KC_KP_2, KC_KP_3, KC_KP_ENTER, KC_NO,
KC_KP_0, M(KP_00), KC_KP_COMMA, KC_KP_ENTER, KC_NO,
KC_TRNS, KC_TRNS,
KC_TRNS,
KC_TRNS, KC_TRNS, KC_NO)
};
// Whether the macro 1 is currently being recorded.
static bool is_macro1_recording = false;
// The current set of active layers (as a bitmask).
// There is a global'layer_state' variable but it is set after the call
// to layer_state_set_user().
static uint32_t current_layer_state = 0;
uint32_t layer_state_set_user(uint32_t state);
// Method called at the end of the tap dance on the TAP_MACRO key. That key is
// used to start recording a macro (double tap or more), to stop recording (any
// number of tap), or to play the recorded macro (1 tap).
void macro_tapdance_fn(qk_tap_dance_state_t *state, void *user_data) {
uint16_t keycode;
keyrecord_t record;
dprintf("macro_tap_dance_fn %d\n", state->count);
if (is_macro1_recording) {
keycode = DYN_REC_STOP;
is_macro1_recording = false;
layer_state_set_user(current_layer_state);
} else if (state->count == 1) {
keycode = DYN_MACRO_PLAY1;
} else {
keycode = DYN_REC_START1;
is_macro1_recording = true;
layer_state_set_user(current_layer_state);
}
record.event.pressed = true;
process_record_dynamic_macro(keycode, &record);
record.event.pressed = false;
process_record_dynamic_macro(keycode, &record);
}
// The definition of the tap dance actions:
qk_tap_dance_action_t tap_dance_actions[] = {
// This Tap dance plays the macro 1 on TAP and records it on double tap.
[TAP_MACRO] = ACTION_TAP_DANCE_FN(macro_tapdance_fn),
};
// Runs for each key down or up event.
bool process_record_user(uint16_t keycode, keyrecord_t *record) {
if (keycode != TD(TAP_MACRO)) {
// That key is processed by the macro_tapdance_fn. Not ignoring it here is
// mostly a no-op except that it is recorded in the macros (and uses space).
// We can't just return false when the key is a tap dance, because
// process_record_user, is called before the tap dance processing (and
// returning false would eat the tap dance).
if (!process_record_dynamic_macro(keycode, record)) {
return false;
}
}
return true; // Let QMK send the enter press/release events
}
const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt)
{
switch(id) {
// keypad "double 0"
case KP_00:
if (record->event.pressed) {
return MACRO( T(KP_0), D(KP_0), END );
} else {
return MACRO( U(KP_0), END );
}
// QUESTION RÉPONSE en cours. en bépo qwerty pour bold et underline u:s b:q.
case KP_QUESTION:
if (record->event.pressed) {
SEND_STRING(SS_TAP(X_ENTER)SS_TAP(X_ENTER)SS_TAP(X_UP)SS_LCTRL("sq") "Lwer;kf" SS_LCTRL("sq") "V "SS_LCTRL("sq")SS_TAP(X_TAB)SS_TAP(X_TAB)SS_TAP(X_UP)SS_LCTRL("sq")"Msfkjdr;" SS_LCTRL("sq") " V N"SS_LCTRL("sq")SS_TAP(X_TAB)SS_TAP(X_TAB)SS_LCTRL("sq")SS_TAP(X_LEFT)SS_TAP(X_LEFT)SS_TAP(X_LEFT));
return false;
}
// line -------
case KP_LINE:
if (record->event.pressed) {
SEND_STRING(SS_LCTRL("sq")SS_TAP(X_TAB)SS_TAP(X_TAB)SS_LCTRL("sq")" ");
return false;
}
// Macro planche photo
case KP_PLANCHE:
if (record->event.pressed) {
return MACRO(D(LSFT), D(LCTRL), T(PSCREEN), U(LSFT), U(LCTRL), END);
return false;
}
break;
}
return MACRO_NONE;
};
Explication:
- Macro PLANCHE: séquence CTRL+MAJ+PSCREEN pour faire des copies d'écran en sélectionnant une zone puis copier dans le presse papier. Dans le keymap c'est ça MACRO(D(LSFT), D(LCTRL), T(PSCREEN), U(LSFT), U(LCTRL), END); // D(truc) = presser truc, T(truc) = appuyer et relâcher truc, U(truc) = relâcher truc.
- Macro Fin de ligne: ctrl+u et ctrl+b (SS_LCTRL("sq")) et faire des tabulations SS_TAP(X_TAB) pour faire des traits en fin de ligne. Puis refaire ctrl+u et ctrl+b pour annuler le soulignement et le gras (oups je viens de capter que je fais gras pour rien!). Ça fait ça
. .
- macro question réponse: pour résumer ça va écrire
Question: ?
. .
Réponse:
. .
Et ça va me replacer devant le ?
- TD(TAP_MACRO) est une macro dynamique avec tap dance. Tu appuies deux fois et ça commence à enregistrer. Tu appuies deux fois et ça stop l'enregistrement. Et quand tu vas appuyer une fois sur la touche ça va écrire ce que tu as tapé durant le temps de l'enregistrement.
Voilà voilà. Pour résumer, tu peux faire n'importe quelle séquence de frappe avec les macros. La
liste des touches est énorme. Donc a priori, tous tes raccourcis claviers. Si tu veux pas toucher à ton layer de base, tu peux placer tes macros sur le layer num main gauche.
Ne pas hésiter si tu as des questions. Mais peut être qu'un modo voudra qu'on ouvre un nouveau post dédié à la programmation de macro sous QMK.
PS : si tu es un grand utilisateur des touches Fxy, pourquoi ne pas les faire en tap dance sur la ligne des chiffres ? Exemple :
1 une fois donne « , 1 deux fois rapides donne F1.