diff --git a/catgirl.1 b/catgirl.1 index 62f373e..e9476b7 100644 --- a/catgirl.1 +++ b/catgirl.1 @@ -293,6 +293,9 @@ Delete line after cursor. .It Aq Sy Tab Cycle through completions for commands, nicks and channels. +. +.It Sy M-? +ROT13-encode line. .El . .Ss IRC Formatting diff --git a/chat.h b/chat.h index 441056c..03f3251 100644 --- a/chat.h +++ b/chat.h @@ -162,6 +162,7 @@ enum Edit { EditKillBackWord, EditKillForeWord, EditKillLine, + EditROT13, EditComplete, EditEnter, }; diff --git a/edit.c b/edit.c index 88301f6..93cba12 100644 --- a/edit.c +++ b/edit.c @@ -19,6 +19,7 @@ #include #include #include +#include #include "chat.h" @@ -94,6 +95,14 @@ static void killForeWord(void) { line.ptr = from; } +static void rot13(void) { + for (wchar_t *ch = line.buf; ch != line.end; ++ch) { + if (!iswascii(*ch)) continue; + if (iswupper(*ch)) *ch = L'A' + (*ch - L'A' + 13) % 26; + if (iswlower(*ch)) *ch = L'a' + (*ch - L'a' + 13) % 26; + } +} + static char *prefix; static void complete(struct Tag tag) { if (!line.tab) { @@ -175,6 +184,8 @@ void edit(struct Tag tag, enum Edit op, wchar_t ch) { break; case EditKillForeWord: reject(); killForeWord(); break; case EditKillLine: reject(); line.end = line.ptr; + break; case EditROT13: accept(); rot13(); + break; case EditComplete: complete(tag); break; case EditEnter: accept(); enter(tag); diff --git a/ui.c b/ui.c index a4fedf5..fbbaae2 100644 --- a/ui.c +++ b/ui.c @@ -472,6 +472,7 @@ static void keyChar(wchar_t ch) { break; case L'f': edit(ui.view->tag, EditForeWord, 0); break; case L'\b': edit(ui.view->tag, EditKillBackWord, 0); break; case L'd': edit(ui.view->tag, EditKillForeWord, 0); + break; case L'?': edit(ui.view->tag, EditROT13, 0); break; case L'm': uiLog(ui.view->tag, UICold, L""); break; default: { if (ch >= L'0' && ch <= L'9') uiViewNum(ch - L'0');